美文网首页
Checkbox的RecyclerView单选,多选问题

Checkbox的RecyclerView单选,多选问题

作者: Rhett_yu | 来源:发表于2021-11-23 17:43 被阅读0次

    问题: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的数据

    参考链接:https://www.jianshu.com/p/ed550152010a

    相关文章

      网友评论

          本文标题:Checkbox的RecyclerView单选,多选问题

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