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();
                    }
                }
            }
        }
    });
问题是当我选择一个checkBox要检查的checkBox其他东西checkBox时RecyclerView。但是,当我签入adapter项目时,正确添加了项目,但checkBox选择却重复了。
例如:如果我选中了第一个项目checkBox并向下滚动,则第16个项目checkBox也会被选中。取消选中checkBox也会取消选中第一项。   
回收者视图回收OnBindViewHolder中的视图。因此,当单击项目时,它会反映在其他一些位置。创建一个全局SparseBooleanArray来存储单击位置。
private final SparseBooleanArray array=new SparseBooleanArray();
然后在最终的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();
            }
        });
    }
}
在OnBindViewHolder内部,
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    if(array.get(position)){
        holder.followDiseaseCheckBox.setChecked(true);
    }else{
        holder.followDiseaseCheckBox.setChecked(false);
    }
}
您可能缺少recylerview的一些概念。事实是,recyclerview每9个项目绑定/回收一个相同的视图。因此,为了避免这种情况,请setItemViewCacheSize()在您的活动中加以利用。
例:
contactListAdapter = new ContactsListAdapter(ContactActivity.this, contactArrayList);
        mRecyclerView.setItemViewCacheSize(contactArrayList.size());
        mRecyclerView.setAdapter(contactListAdapter);
public void setItemViewCacheSize(int size)设置要保留的屏幕外视图的数量,然后再将其添加到潜在的共享回收视图池中。屏幕外视图高速缓存始终了解连接的适配器中的更改,从而LayoutManager可以重用那些未经修改的视图,而无需返回适配器重新绑定它们。参数:size-将其返回到常规回收视图池之前要在屏幕外缓存的视图数
| 归档时间: | 
 | 
| 查看次数: | 3448 次 | 
| 最近记录: |