问题:recyclerview在每个item里面都有一个chekcbox,如果我有20个item,我选中的第一个item的checkbox,那么下面一定会有一个item会跟第一个item进行复用,其实这不仅仅是checkbox,你换成一个图标也一样的道理,选中和不选中依然会有这个问题
解决思路:
1,能不能不让条目复用?(违背了recyclerview的设计初衷,如果列表是固定的几条item可以用)
2,item选中状态是一种数据(true/false),能不能让数据不复用
public class ObjectAdapter extends BaseBindingAdapter<TopicHomeChoseDialogBean, ItemHomeChoseObjectDialogBinding> {
private Context mContext;
List<TopicHomeChoseDialogBean> listInfo;
//用来记录所有checkbox的状态
private Map<Integer, Boolean> hashMap = new HashMap<>();
public ObjectAdapter(Context mContext, List<TopicHomeChoseDialogBean> listInfo) {
super(R.layout.item_home_chose_object_dialog);
this.mContext = mContext;
this.listInfo = listInfo;
initMap(listInfo);
}
/**
* 初始化map集合,将所有checkbox默认设置为false
*/
private void initMap(List dataList) {
if (!dataList.isEmpty()) {
for (int i = 0; i < dataList.size(); i++) {
hashMap.put(i, false);
}
}
}
@Override
protected void bindView(BaseBindingHolder holder, TopicHomeChoseDialogBean info, ItemHomeChoseObjectDialogBinding binding, int position) {
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) binding.itemRl.getLayoutParams();
int imageSize = (ScreenUtils.getScreenWidth() - SizeUtils.dp2px(120) - SizeUtils.dp2px(8)) / 3;
params.width = imageSize;
params.height = imageSize;
binding.itemRl.setLayoutParams(params);
binding.tvName.setText("次元" + position);
if (info != null) {
binding.itemRl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!hashMap.get(position)) {
hashMap.put(position, true);//每个position为唯一索引,进行存和取
// listInfo.get(position).setClicked(true);//设置数据没用错误
binding.checkImg.setImageResource(R.mipmap.object_dialog_img_checked);
onItemClickListener.onClick(position, true);
} else {
// listInfo.get(position).setClicked(false);
hashMap.put(position, false);//每个position为唯一索引,进行存和取
binding.checkImg.setImageResource(R.mipmap.report_check_default);
onItemClickListener.onClick(position, false);
}
}
});
if (!hashMap.get(position)) {
binding.checkImg.setImageResource(R.mipmap.report_check_default);
} else {
binding.checkImg.setImageResource(R.mipmap.object_dialog_img_checked);
}
}
}
所有的item状态都用一个map集合存起来,
在页面加载时候,在适配器的构造函数中需要对map集合进行初始化(所有的checkbox默认选中是false)
当你点击checkbox的时候,我们去重新设置checkbox的状态,然后获取,这样就能够完美的解决复用问题了
然后再回调这个map的数据
网友评论