RecyclerView中复选框选择中的重复项

Ram*_*gde 3 checkbox android recycler-adapter android-recyclerview

下面是我的代码。

holder.followDiseaseCheckBox.setOnClickListener(new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public void onClick(View view) {

            if (holder.followDiseaseCheckBox.isChecked()) {

                holder.followDiseaseCheckBox.setChecked(true);

                checkBoxClicked++;
                holder.followDiseaseCheckBox.setChecked(true);
                // for Follow.
                if (isFollowOrUnFollow.equals("FOLLOW")) {

                    ((FollowActivity) context).diseaseListFromAdapter.add(String.valueOf(diseaseMap.get("id")));
                    ((FollowActivity) context).setFollowButton(true);

                }
                // for Unfollow.
                else if (isFollowOrUnFollow.equals("UN_FOLLOW")) {

                    ((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.add(String.valueOf(diseaseMap.get("id")));
                    ((FollowTwoActivity) context).setUnFollowDiseaseButton(true);
                }


            } else {

                holder.followDiseaseCheckBox.setChecked(false);

                checkBoxClicked--;
                holder.followDiseaseCheckBox.setChecked(false);
                // for Follow.
                if (isFollowOrUnFollow.equals("FOLLOW")) {
                    ((FollowActivity) context).diseaseListFromAdapter.remove(String.valueOf(diseaseMap.get("id")));
                }
                // for Unfollow.
                else if (isFollowOrUnFollow.equals("UN_FOLLOW")) {
                    ((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.remove(String.valueOf(diseaseMap.get("id")));
                }

                if (checkBoxClicked == 0) {

                    // for Follow.
                    if (isFollowOrUnFollow.equals("FOLLOW")) {
                        ((FollowActivity) context).setFollowButton(false);
                        ((FollowActivity) context).diseaseListFromAdapter.clear();
                    }
                    // for Unfollow.
                    else if (isFollowOrUnFollow.equals("UN_FOLLOW")) {

                        ((FollowTwoActivity) context).setUnFollowDiseaseButton(false);
                        ((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.clear();
                    }
                }
            }

        }
    });
Run Code Online (Sandbox Code Playgroud)

问题是当我选择一个checkBox要检查的checkBox其他东西checkBoxRecyclerView。但是,当我签入adapter项目时,正确添加了项目,但checkBox选择却重复了。

例如:如果我选中了第一个项目checkBox并向下滚动,则第16个项目checkBox也会被选中。取消选中checkBox也会取消选中第一项。

sha*_*mar 6

回收者视图回收OnBindViewHolder中的视图。因此,当单击项目时,它会反映在其他一些位置。创建一个全局SparseBooleanArray来存储单击位置。

private final SparseBooleanArray array=new SparseBooleanArray();
Run Code Online (Sandbox Code Playgroud)

然后在最终的Viewholder中添加clickListener和onClick存储被单击项的位置。

public class ViewHolder extends RecyclerView.ViewHolder {
    public YOURVIEW view;
    public ViewHolder(View v) {
        super(v);
        view = (YOURVIEW) v.findViewById(R.id.YOURVIEWID);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                array.put(getAdapterPosition(),true);
                notifyDataSetChanged();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在OnBindViewHolder内部,

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    if(array.get(position)){
        holder.followDiseaseCheckBox.setChecked(true);
    }else{
        holder.followDiseaseCheckBox.setChecked(false);
    }
}
Run Code Online (Sandbox Code Playgroud)


Moh*_*han 6

您可能缺少recylerview的一些概念。事实是,recyclerview每9个项目绑定/回收一个相同的视图。因此,为了避免这种情况,请setItemViewCacheSize()在您的活动中加以利用。

例:

contactListAdapter = new ContactsListAdapter(ContactActivity.this, contactArrayList);
        mRecyclerView.setItemViewCacheSize(contactArrayList.size());
        mRecyclerView.setAdapter(contactListAdapter);
Run Code Online (Sandbox Code Playgroud)

public void setItemViewCacheSize(int size)设置要保留的屏幕外视图的数量,然后再将其添加到潜在的共享回收视图池中。屏幕外视图高速缓存始终了解连接的适配器中的更改,从而LayoutManager可以重用那些未经修改的视图,而无需返回适配器重新绑定它们。参数:size-将其返回到常规回收视图池之前要在屏幕外缓存的视图数