适配器使用CheckBox勾选混乱的解决方案

今天,使用RecyclerView + Checkbox的时候,发生了checkbox状态错乱的问题.

RecyclerView 为了提高效率,使用了Recycler回收机制,它的作用就是,不会产生多余的itemView,如果产生了向上滑动,就将最上方的itemView保存起来,然后接到最下面,然后重新加载数据(onBindViewHolder会被调用)。但是这种方式,如果itemView中有checkbox,要继承之前的勾选状态,那就坑了爹了。因为重用的itemView会保留之前的check状态。

必须要想办法,标记它的勾选状态,才能正常显示勾选。

熟悉RecyclerView的人应该都知道,RecyclerView使用了复用机制,当在RecyclerView中得每一项都添加一个CheckBox时,勾选当前页面的几个CheckBox会发现下面还有其他的CheckBox也被勾选了,今天我们就来讨论一下如何解决这个问题。

创建CheckBox页面的代码:

<LinearLayout
   
android:layout_width="wrap_content"
   
android:layout_height="wrap_content"
   
android:orientation="vertical"
   
android:layout_gravity="center">
    <
CheckBox
       
android:id="@+id/cb_checkone"
       
android:layout_marginLeft="10dp"
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content"/>
LinearLayout>

利用一组List来记录每一个checkbox的选中状态,然后在checkbox的选中事件中,把这个信息存进DishesVo里面。

public static List selectData = new ArrayList<>();

获取checkbox的控件点击事件

适配器使用CheckBox勾选混乱的解决方案_第1张图片

给checkbox点击事件,让选中一次就把一个id存进声明的List里面,如果取消选中就删除该条数据。
holder.cbCheckone.setOnClickListener(new View.OnClickListener() {
   
@Override
   
public void onClick(View v) {
       
if (holder.cbCheckone.isChecked()) {
           
//添加选中的数据
            DishesVo dishesVo = new DishesVo();
            dishesVo.setWinegreid(
winegre.getWinegreid());
            
selectData.add(dishesVo);
        }
else {
           
//遍历选中数据,移除取消选中的数据
            for (DishesVo dishesVo : selectData) {
               
if (dishesVo.getWinegreid() == winegre.getWinegreid()) {
                   
selectData.remove(dishesVo);
                   
break;
                }
            }
        }
       
onItemClickListener.onCheckBoxClickListener(v, winegre, position);
    }
});

最后在绑定数据的时候去判断,当声明的List没有数据就不处理,有数据就用for循环遍历selectData,根据后台查出来的ID和存进selectData的ID进行比较,相等的话就让checkbox选中,否则就取消checkbox。

适配器使用CheckBox勾选混乱的解决方案_第2张图片

 

你可能感兴趣的:(适配器使用CheckBox勾选混乱的解决方案)