大飞

大飞 关注TA

挑战一切!

大飞

大飞

关注TA

挑战一切!

  •  世界的顶端
  • 混口饭吃
  • 写了333,609字

最近回复

该文章投稿至Nemo社区   Android  板块 复制链接


CheckBox setOnCheckedChangeListener大坑

发布于 2017/06/20 09:35 1,977浏览 4回复 1,606

在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);
            }
        });
点赞(0)
点了个评