最近在做一个相册导入的东西,用了RecyclerView 的 Grid 布局,像这样:

其中每个 Item 都带了一个 CheckBox 用于做选中/非选中状态,
本以为一切能按我的想法进行:
创建一个 photoModel 给他们一个bool 值 isSelect 表示是否选中;
当选中一个 item 时修改数据源中对应的 photoModel ,使它的 isSelect = true,
然后 notifyDataSetChanged() 刷新就行了。
运行之后,事与愿违。
选中 item 之后再滑动触发复用,整个列表的选中状态变得乱七八糟,惨不忍睹。
RecyclerView的复用导致了这个问题,那么
如何解决呢
解决方案:
- 创建一个用于记录CheckBox状态的List
private List<Interger> checkBoxTagList;
- 在onBindViewHolder方法中为每个CheckBox设置tag,
并通过checkBoxTagList中保存的状态tag,确定每个CheckBox的选中状态
holder.checkBox.setTag(new Integer(position));
if (checkBoxUserIdList != null) {
holder.checkBox.setChecked((checkBoxUserIdList.contains(new Integer(position)) ? true : false));
} else {
holder.checkBox.setChecked(false);
}
- 为CheckBox 添加监听setOnCheckedChangeListener,并在onCheckedChanged 中加入如下判断
if (isChecked) {
if (!checkBoxUserIdList.contains(helper.checkBox.getTag())) {
checkBoxUserIdList.add(new Integer(helper.getAdapterPosition()));
}
} else {
if (checkBoxUserIdList.contains(helper.checkBox.getTag())) {
checkBoxUserIdList.remove(new Integer(helper.getAdapterPosition()));
}
}
- 在给CheckBox赋值之前,先setOnCheckedChangeListener为null
checkBox.setOnCheckedChangeListener(null);
checkBox.setChecked(item.isSelect());
以上。
网友评论