美文网首页Android知识Android开发Android技术知识
RecycleView中使用CheckBox需要注意的问题

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

作者: 淡日临窗 | 来源:发表于2017-05-24 22:00 被阅读1149次

更新修改

最近在项目中碰到这个问题,需要记录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());
  
            }
        });      

相关文章

网友评论

    本文标题:RecycleView中使用CheckBox需要注意的问题

    本文链接:https://www.haomeiwen.com/subject/gcpbtxtx.html