问题
RecycleView 中 checkbox 被选中后,上下滑动列表,滑动超过一屏内容时,再滑回来,checkbox 选中状态被清除。
原因
RecycleView 中使用 ViewHolder 来保存数据,当滑动超过一屏内容时,再滑回来,ViewHolder 数据需要重新加载,会触发 onBindViewHolder 这个方法。 一般在这个方法中,checkbox 会重新加载选择状态,这就容易出问题。
解决方法
使用额外的一个 list 或者 map 保存选中的数据,然后在 onBindViewHolder 中读取即可。
    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.mItem = mValues.get(position);
        //holder.mCheckbox.setChecked(mValues.get(position).check);
        holder.mCheckbox.setChecked(((DataFragment)mFragment).getCheck(mValues.get(position).analysisId));
        holder.mIdView.setText(mValues.get(position).id);
        holder.mAnalysisIdView.setText(mValues.get(position).analysisId);
        DLog.d(TAG, "onBindViewHolder: " +
                ", id: " + mValues.get(position).id +
                ", holder check: " + mValues.get(position).check +
                ", list check: " + ((DataFragment)mFragment).getCheck(mValues.get(position).analysisId) +
                ", analysis id: " + mValues.get(position).analysisId);
    }
设置可以在 onCreateViewHolder 中:
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //return new ViewHolder(FragmentDataListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
        final ViewHolder holder = new ViewHolder(FragmentDataListItemBinding.
                inflate(LayoutInflater.from(parent.getContext()), parent, false));
        holder.mCheckLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = holder.getAdapterPosition();
                PlaceholderItem item = mValues.get(position);
                boolean isChecked = !((DataFragment)mFragment).getCheck(item.analysisId);
                holder.mCheckbox.setChecked(isChecked);
                DLog.d(TAG, "onCreateViewHolder: " + "mCheckLayout: " + isChecked);
                Toast.makeText(v.getContext(), "click checkbox: " + item.id +
                        ", " + isChecked + ", position: " + position, Toast.LENGTH_SHORT).show();
                ((DataFragment)mFragment).setCheckList(item.analysisId, isChecked);
            }
        });
        return holder;
    }
设置也可以在 onBindViewHolder中:
    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.mItem = mValues.get(position);
        ...
        holder.mCheckLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //int position = holder.getAdapterPosition();
                //PlaceholderItem item = mValues.get(position);
                boolean isChecked = !((DataFragment)mFragment).getCheck(holder.mItem.analysisId);
                holder.mCheckbox.setChecked(isChecked);
                DLog.d(TAG, "onCreateViewHolder: " + "mCheckLayout: " + isChecked);
                Toast.makeText(v.getContext(), "click checkbox: " + holder.mItem.id +
                        ", " + isChecked, Toast.LENGTH_SHORT).show();
                ((DataFragment)mFragment).setCheckList(holder.mItem.analysisId, isChecked);
            }
        });
    }
参考:
Recycleview来回滑动时选中的CheckBox消失问题
https://blog.csdn.net/weixin_47592544/article/details/123989788
RecycleView中使用CheckBox需要注意的问题
https://www.jianshu.com/p/86d15d487235
Recyclerview中使用CheckBox的问题总结
https://www.jianshu.com/p/4dc62e0800ce
Android高级控件之RecyclerView上放置CheckBox
https://blog.csdn.net/a_zhon/article/details/52928791
Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能
https://blog.csdn.net/qq_26787115/article/details/50609604
RecyclerView嵌入CheckBox带来的显示问题的解决办法
https://its301.com/article/qq_33748378/53133020
RecyclerView+CheckBox的使用
https://www.codenong.com/js606049e38538/
RecyclerView中使用CheckBox勾选混乱问题解决以及单选功能的实现
https://blog.csdn.net/ww897532167/article/details/77529605
 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号