精选圈子榜单优站
编程综合
编程综合
技术
20关注
编程技术记录、分享 ,记录你的编程生活点点滴滴!

CheckBox setOnCheckedChangeListener大坑


在recycleview列表中有CheckBox,在使用中,有些操作,无可避免的要刷新适配器,这样需要一个变量记录上一状态是否被选中了,在hodler中需要这样cbCheckShop.setChecked(model.isCheck);//适配器刷新后还原勾选状态

有这么一个场景,我需要点击CheckBox之后去刷新适配器,马上就想到了 setOnCheckedChangeListener,于是有以下代码:

  binding.cbCheckShop.setChecked(model.isCheck);//适配器刷新后还原勾选状态
        binding.cbCheckShop.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                model.isCheck=isChecked;
                model.setCheck();
                RxBus.getDefault().post(RxCodeConstants.SHOP_CART,1);//刷新适配器
            }
        });

然后。。。。问题来了,死循环。

当调用这句话setChecked(model.isCheck)的时候 setOnCheckedChangeListener执行了,而里面又有刷新适配器的代码,下一轮又走setChecked(model.isCheck);不断的死循环,game over

最后这样做:

  binding.cbCheckShop.setChecked(model.isCheck);//适配器刷新后还原勾选状态
     /*   binding.cbCheckShop.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                model.isCheck=isChecked;
                model.setCheck();
                RxBus.getDefault().post(RxCodeConstants.SHOP_CART,1);//刷新适配器
            }
        });*/
        binding.cbCheckShop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                model.isCheck=!model.isCheck;
                model.setCheck();
                RxBus.getDefault().post(RxCodeConstants.SHOP_CART,1);
            }
        });

  • 若文章侵犯了您的权益,请联系我们进行处理。

  • 2017-06-20
  • 2575阅读
评论