适配器使用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<DishesVo> selectData = new ArrayList<>();
获取checkbox的控件点击事件
给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。