Recycler View + Stars而不是Checkboxes:滚动时保持状态

时间:2016-07-09 13:33:11

标签: android checkbox android-recyclerview android-adapter android-viewholder

我遇到了列表+ RecyclerView的常见问题:当我更改项目的资源文件(又名:选中/未选中的星形图标)然后滚动时,列表中的其他项目保持相同的选择/他们自己的明星未经选择的状态。另外,当我选择一个项目然后返回时,我错过了所选/未选择的状态。

fullStar和emptyStar是简单的Android矢量图片。

这是我的ListFragment:

public class PetrolStationListFragment extends Fragment {

private RecyclerView mPetrolStationRecyclerView;
private PetrolStationAdapter mAdapter;
private int itemPosition;
public static boolean toBeCreated;

private static final String ARG_POSITION = "position";


// Design pattern to instantiate a new fragment.
public static PetrolStationListFragment newInstance(int position) {
    PetrolStationListFragment fragment = new PetrolStationListFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_POSITION, position);

    fragment.setArguments(args);

    return fragment;
}


/********************************************************/

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_petrol_station_list, container, false);

    mPetrolStationRecyclerView = (RecyclerView) view.findViewById(R.id.petrol_recycler_view);
    mPetrolStationRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    updateUI();

    return view;
}

@Override
public void onResume() {
    super.onResume();

    updateUI();
}

private void updateUI() {
    PetrolStationDAO petrolStationDAO = PetrolStationDAO.get(getActivity());
    List<PetrolStation> petrolStations = petrolStationDAO.getPetrolStations();

    if (mAdapter == null || toBeCreated) {
        mAdapter = new PetrolStationAdapter(petrolStations);
        mPetrolStationRecyclerView.setAdapter(mAdapter);
        toBeCreated = false;
    } else {
        mAdapter.notifyItemChanged(itemPosition);
    }
}

private class PetrolStationHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private PetrolStation mPetrolStation;

    private TextView mNameTextView;
    private TextView mAddressTextView;
    private TextView mDistanceTextView;
    private AppCompatImageView mStar;
    private boolean mFavourite;

    public PetrolStationHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);

        mNameTextView = (TextView) itemView.findViewById(R.id.list_item_station_name_text_view);
        mAddressTextView = (TextView) itemView.findViewById(R.id.list_item_station_address_text_view);
        mDistanceTextView = (TextView) itemView.findViewById(R.id.list_item_station_distance_text_view);
        mStar = (AppCompatImageView) itemView.findViewById(R.id.list_item_station_star_image_view);
        mStar.setTag(R.id.list_item_station_star_image_view, "emptyStar");
    }

    public void bindPetrolStation(PetrolStation petrolStation) {
        mPetrolStation = petrolStation;
        mNameTextView.setText(mPetrolStation.getName());
        mAddressTextView.setText("Via Verdi, 19/A");
        mDistanceTextView.setText("300 meters");
        mFavourite = mPetrolStation.isFavourite(mStar);
        Log.d("FAVOURITE", "mFavourite: " + mFavourite);

        //setStarByBoolean();


        mStar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                setStarByTag();
            }
        });
    }

    @Override
    public void onClick(View v) {
        //itemPosition = mPetrolStationRecyclerView.getChildAdapterPosition(v);
        Intent intent = PetrolStationPagerActivity.newIntent(getActivity(), mPetrolStation.getId());
        startActivity(intent);
    }

    public void setStarByBoolean() {
        if (!mFavourite) {
            mStar.setImageResource(R.drawable.ic_star_border_orange);
            mStar.setTag(R.id.list_item_station_star_image_view, "emptyStar");
        } else {
            mStar.setImageResource(R.drawable.ic_star_orange);
            mStar.setTag(R.id.list_item_station_star_image_view, "fullStar");
        }
    }

    public void setStarByTag() {
        if (mStar.getTag(R.id.list_item_station_star_image_view).equals("emptyStar")) {
            mStar.setImageResource(R.drawable.ic_star_orange);
            mStar.setTag(R.id.list_item_station_star_image_view, "fullStar");
        } else {
            mStar.setImageResource(R.drawable.ic_star_border_orange);
            mStar.setTag(R.id.list_item_station_star_image_view, "emptyStar");
        }
    }

}

private class PetrolStationAdapter extends RecyclerView.Adapter<PetrolStationHolder> {

    private List<PetrolStation> mPetrolStations;

    public PetrolStationAdapter(List<PetrolStation> petrolStations) {
        mPetrolStations = petrolStations;
    }

    @Override
    public PetrolStationHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
        View view = layoutInflater.inflate(R.layout.list_item_petrol_station, parent, false);

        return new PetrolStationHolder(view);
    }

    @Override
    public void onBindViewHolder(PetrolStationHolder holder, int position) {
        PetrolStation petrolStation = mPetrolStations.get(position);
        Log.d("POSITION", "position: " + position);
        holder.bindPetrolStation(petrolStation);
    }

    @Override
    public int getItemCount() {
        return mPetrolStations.size();
    }

}

}

这里是PetrolStation Model类的getter和setter:

    public boolean isFavourite(AppCompatImageView star) {
    if (star.getTag(R.id.list_item_station_star_image_view).equals("emptyStar")) {
        mFavourite = false;
    } else {
        mFavourite = true;
    }

    return mFavourite;
}

public void setFavourite(boolean favourite) {
    this.mFavourite = favourite;
}

有关如何解决此问题的任何提示?我发现很难将我发现的CheckBoxes示例应用到我自己的案例中。

0 个答案:

没有答案