RecycleView中使用CheckBox需要注意的问题

更新修改

最近在项目中碰到这个问题,需要记录checkBox选中的项,还包括全选和取消全选,提供一个新的解决办法,原理是一样的;

原理:RecycleView具有复用性,条目中的checkBox的选中状态可能会被复用而导致混乱,如果RecycleView条目中的checkBox都有相应的数据源,刷新的时候每个条目中的checkBox会赋予相应的状态,也就不会发生混乱,相当于适配器将数据源赋给指定的控件一样,那具体怎样建造checkBox的数据源呢,下面介绍方法:

用SparseBooleanArray来存放checkBox的状态,checkBox默认是未选中状态

// 先给其默认值为false
private SparseBooleanArray mCheckStates=new SparseBooleanArray();

SparseBooleanArray是一种可以存放Boolean值的数组,它的index可以是不连续的,在这里特别适用

在开始的时候给每个checkBox设置一个Tag值,方便状态改变时获取指定的checkBox

holder.checkbox_car_select.setTag(position);

监听checkBox的状态变化,并将状态保存到数组中

holder.checkbox_car_select.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int pos= (int) buttonView.getTag();
                mCheckStates.put(pos,isChecked);

                if (mListener != null) {
                    mListener.onCheckedChangeListener(mCheckStates);
                }
            }
        });

最后在加上给checkBox赋予状态的代码

holder.checkbox_car_select.setChecked(mCheckStates.get(position,false));

项目中使用RecycleView时,其中条目中使用了checkbox,在选中时由于holder的复用性,导致checkbox选中出现混乱,下面提供一种解决方案。

下面是项目中使用的示例,需要记录checkbox的选中个数和位置:

 /**
  * 由于的RecycleView的复用机制导致checkbox的选中事件发生混乱,这里用一个数组flag[position]来记录的选中情况
  */
  holder.cb_select.setOnCheckedChangeListener(null);
  holder.cb_select.setChecked(flag[position]);

  holder.cb_select.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
         @Override
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
             Log.e("cb_select>>","========"+isChecked);
             flag[position] = isChecked;
             /**
               * 记录checkbox点击的个数及点击的index
               */
                if (isChecked){
                    mPositionList.add(position);
                }else {
                    for (int i = 0; i < mPositionList.size(); i++) {
                        if (mPositionList.get(i)==position){
                            mPositionList.remove(i);
                        }
                    }

                }
                Log.e("cb_select>>","mPositionList=="+mPositionList.size());
  
            }
        });      

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容