Recycler View条目复之checkbox混乱以及限制checkbox可选数量

在项目中需要用到recycler View以及CheckBox,但是在勾选check后上下滑动recycler view时checkbox出现混乱了,debug了下,发现是因为在上下滑动recycler View时,当你的item很多时向上或向下拉时它的item重新绘制了,所以导致check选择混乱。

我在百度上找了下,我觉得可以的check.setTag,看代码:

private HashMap hashMap = new HashMap();
private SparseBooleanArray mCheckStates=new SparseBooleanArray();//用于存放选择的状态

@Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int i) {
        viewHolder.checkBox.setTag(i);//在最开始适配的时候,将每一个CheckBox设置一个当前的Tag值,这样每个CheckBox都有了一个固定的标识

        setCheck_true(viewHolder,i);
      }


//单选
    private void setCheck_true(final ViewHolder viewHolder, final int i){
        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int pos= (int) buttonView.getTag();//得到当前CheckBox的Tag值,由于之前保存过,所以不会出现索引错乱
                if (isChecked){
                    //点击时将当前CheckBox的索引值和Boolean存入SparseBooleanArray中
                    if (hashMap.size()<num){
                        mCheckStates.put(pos,true);
                        hashMap.put(pos,pos);
                    }else if (mCheckStates.get(i,false)==false){
                        viewHolder.checkBox.setChecked(false);
                        ToastUtil.showToast((Activity) context,"金币数不足",1500);
                    }
                }else {
                    viewHolder.checkBox.setClickable(true);
                    //否则将 当前CheckBox对象从SparseBooleanArray中移除
                    mCheckStates.delete(pos);
                    hashMap.remove(pos);
                }
            }

        });
        //得到CheckBox的Boolean值后,将当前索引的CheckBox状态改变
        viewHolder.checkBox.setChecked(mCheckStates.get(i,false));
    }

这样子在上下滑动时,遇到Viewholder重新绘制时,就会去mCheckStates中获取该位置的check的状态;

 

做完这些后,觉得不完善就去加了个限制check的点击数量,无论是单个点击还是全选都必须在这个数量内,之间无论用check。setChecked(false)都没用,因为在上下滑动recycler时,item又重新绘制了,每次在item0点击了但是在刷新下一页时,下一页的第一个也被点击了,我就去设定一个(int count=0)每次点击时,自增,取消时自减,但还是不行在recycler重新绘制时count 在新绘制的地方(count=0)拉recycler到先前的位置,count还是先前自增的数量,pass。

于是我就用hashmap来存放点击的item的position:hash.put(position,position);然后在点击时判断(hash.size<num)然后在else if中判断(mCheckStates.get(i,false)==false),

mCheckStates.get(i,false)==true:则说明该item的 check是true;mCheckStates.get(i,false)==false:说明该item没被点击,但是它(checkbox)在重绘时会被shecheck(true),所以需要

viewHolder.checkBox.setChecked(false);

看代码:

 viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int pos= (int) buttonView.getTag();//得到当前CheckBox的Tag值,由于之前保存过,所以不会出现索引错乱
                if (isChecked){
                    //点击时将当前CheckBox的索引值和Boolean存入SparseBooleanArray中
                    if (hashMap.size()<num){
                        mCheckStates.put(pos,true);
                        hashMap.put(pos,pos);
                    }else if (mCheckStates.get(i,false)==false){
                        viewHolder.checkBox.setChecked(false);
                        ToastUtil.showToast((Activity) context,"金币数不足",1500);
                    }
                }else {
                    viewHolder.checkBox.setClickable(true);
                    //否则将 当前CheckBox对象从SparseBooleanArray中移除
                    mCheckStates.delete(pos);
                    hashMap.remove(pos);
                }
            }

        });
        //得到CheckBox的Boolean值后,将当前索引的CheckBox状态改变
        viewHolder.checkBox.setChecked(mCheckStates.get(i,false));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝麻猪oo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值