Android 在RecyclerView中的复选框选择中重复

Android 在RecyclerView中的复选框选择中重复,android,checkbox,android-recyclerview,Android,Checkbox,Android Recyclerview,下面是我的代码 holder.followDiseaseCheckBox.setOnClickListener(new View.OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onClick(View view) { if (holder.followDiseaseCheckBox.isC

下面是我的代码

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();
                    }
                }
            }

        }
    });
问题是当我选中一个
复选框
时,在
回收视图
中选中了该
复选框
。但是当我签入
适配器时,
项被正确添加,但是
复选框
选择被重复


例如:如果我选中了第一项
复选框
并向下滚动第16项,则也会选中
复选框
。取消选中
复选框
也将取消选中第一项

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

private final SparseBooleanArray array=new SparseBooleanArray();
然后在最终的viewholder中添加clickListener,然后单击存储被单击项目的位置

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();
            }
        });
    }
}
在Inner OnBindViewHolder中

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    if(array.get(position)){
        holder.followDiseaseCheckBox.setChecked(true);
    }else{
        holder.followDiseaseCheckBox.setChecked(false);
    }
}
公共类CardViewDataAdapter扩展了RecyclerView.Adapter{
私人名单;
公共卡ViewDataAdapter(列出学生){
this.stList=学生;
}
@凌驾
public CardViewDataAdapter.ViewHolder onCreateViewHolder(ViewGroup父级,int-viewType){
//创建新视图
View itemLayoutView=LayoutFlater.from(parent.getContext()).inflate(
R.layout.cardwiew_行,空);
//创建视图持有者
ViewHolder ViewHolder=新的ViewHolder(itemLayoutView);
返回视图持有者;
}
@凌驾
公共无效onBindViewHolder(ViewHolder ViewHolder,int位置){
最终int pos=位置;
viewHolder.tvName.setText(stList.get(position.getName());
viewHolder.tveEmailId.setText(stList.get(position.getEmailId());
viewHolder.chkSelected.setChecked(stList.get(position.isSelected());
viewHolder.chkSelected.setTag(stList.get(position));
viewHolder.chkSelected.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
复选框cb=(复选框)v;
学生联系人=(学生)cb.getTag();
contact.setSelected(cb.isChecked());
stList.get(pos.setSelected)(cb.isChecked());
Toast.makeText(
v、 getContext(),
单击复选框:“+cb.getText()+”是”
+cb.isChecked(),Toast.LENGTH_LONG).show();
}
});
}
//返回大小数组列表
@凌驾
public int getItemCount(){
返回stList.size();
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图tvName;
公共文本视图TVMailID;
公众选举;
公立学生;
公共视图持有者(视图项布局视图){
超级(itemLayoutView);
tvName=(TextView)itemLayoutView.findViewById(R.id.tvName);
TveEmailId=(TextView)itemLayoutView.findViewById(R.id.TveEmailId);
chkSelected=(复选框)itemLayoutView.findviewbyd(R.id.chkSelected);
}
}
//更新所选内容后在“活动”中访问的方法
公共列表GetStudentList(){
返回stList;
}
}

要了解有关复选框选择的更多信息,请按此操作

您可能缺少recylerview的一些概念。事实上,recyclerview在每9项之后绑定/回收相同的视图。因此,为了避免这种情况,只需在活动中使用
setItemViewCacheSize()

例如:

contactListAdapter = new ContactsListAdapter(ContactActivity.this, contactArrayList);
        mRecyclerView.setItemViewCacheSize(contactArrayList.size());
        mRecyclerView.setAdapter(contactListAdapter);
public void setItemViewCacheSize(int size)设置屏幕外的 在将视图添加到潜在共享视图之前要保留的视图 查看池。屏幕外的视图缓存可随时了解视图中的更改 附加的适配器,允许LayoutManager重用这些视图 未修改,无需返回适配器重新绑定。 参数:size-返回前要缓存到屏幕外的视图数 把它们放在普通的可回收景观池里

公共类SuggestionListAdapter扩展了RecyclerView.Adapter{ 私有列表mSuggestionList; 私有上下文; 公共类SuggestionListViewHolder扩展了RecyclerView.ViewHolder{ 专用复选框mCheckBox; 私人直系公寓; 公共建议列表视图持有者(查看项目视图){ 超级(项目视图); mCheckBox=(复选框)itemviewbyd(R.id.list\u display\u复选框); mParent=(LinearLayout)itemviewbyd(R.id.list\u parentll); } } public SuggestionListAdapter(列表suggestionList,上下文){ this.msSuggestionList=suggestionList; this.mContext=上下文; } @凌驾 公共建议ListViewHolder onCreateViewHolder(视图组父级,int-viewType){ 查看新的\u建议\u列表\u视图=LayoutInflater.from(parent.getContext()).flate(R.layout.suggestion\u列表,parent,false); 返回新建议列表视图持有者(新建议列表视图); } @凌驾 BindViewHolder上的公共无效(最终建议ListViewHolder,最终整型位置){ 最终建议=mSuggestionList.get(位置); holder.mCheckBox.setText(suggestion.getCategory()); holder.mCheckBox.setOnCheckedChangeListener(null); holder.mCheckBox.setSelected(suggestion.isSelected()); holder.mCheckBox.setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){ @凌驾 检查更改后的公共无效(复合按钮视图,布尔值已检查){ 如果(已检查){ 建议。已选择(正确); }否则{ 建议。已选择(错误); } } }); holder.mCheckBox.setChecked(suggestion.isSelected()); } @凌驾 public int getItemCount(){ 返回mSuggestionList.size(); } }


看看这个例子,我相信你会发现你犯了什么错误,你可以解决你的问题。

@Shaido&alfakini-相关答案已经发布,我没有回答相同的解决方案,这就是为什么发布参考链接以加深理解的原因。我认为这将有助于澄清这一概念,因为将来SBAH链接可能会中断,因此最好在答案中包含相关信息。如果
contactListAdapter = new ContactsListAdapter(ContactActivity.this, contactArrayList);
        mRecyclerView.setItemViewCacheSize(contactArrayList.size());
        mRecyclerView.setAdapter(contactListAdapter);
public class SuggestionListAdapter extends RecyclerView.Adapter<SuggestionListAdapter.SuggestionListViewHolder> {

private List<Suggestion> mSuggestionList;
private Context mContext;



public class SuggestionListViewHolder extends RecyclerView.ViewHolder{
    private CheckBox mCheckBox;
    private LinearLayout mParent;


    public SuggestionListViewHolder(View itemView) {
        super(itemView);
        mCheckBox = (CheckBox)itemView.findViewById(R.id.list_display_checkbox);
        mParent =(LinearLayout)itemView.findViewById(R.id.list_parentll);
    }
}

public SuggestionListAdapter(List<Suggestion> suggestionList, Context context) {
    this.mSuggestionList = suggestionList;
    this.mContext = context;
}

@Override
public SuggestionListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View new_suggestion_list_view = LayoutInflater.from(parent.getContext()).inflate(R.layout.suggestion_list,parent,false);
    return new SuggestionListViewHolder(new_suggestion_list_view);
}
@Override
public void onBindViewHolder(final SuggestionListViewHolder holder, final int position) {

    final Suggestion suggestion = mSuggestionList.get(position);

    holder.mCheckBox.setText(suggestion.getCategory());
    holder.mCheckBox.setOnCheckedChangeListener(null);
    holder.mCheckBox.setSelected(suggestion.isSelected());
    holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked){
                suggestion.setSelected(true);
            }else {
                suggestion.setSelected(false);
            }
        }
    });
    holder.mCheckBox.setChecked(suggestion.isSelected());
}

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