美文网首页
RecyclerView回收复用引起的checkbox状态改变回

RecyclerView回收复用引起的checkbox状态改变回

作者: 尼古拉斯小韭菜 | 来源:发表于2020-11-17 08:20 被阅读0次

    先看一段代码

    mCheckBox.setChecked(itemData.isSelected);
    mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                       itemData.isSelected = isChecked;
                }
    });
    

    我们在RecylerView或者ListView中绑定添加CheckBox并记录状态时我们经常写这样的代码,但是这样写会出现一个很莫名其妙的问题-状态保存不了,debug调试后发现当CheckBox复用时会导致onCheckedChanged回调,进而改变了已经保存的状态。

    分析其根本原因我们发现,是RecylerView复用机制导致的问题,因为当View复用时,原来被回收的View会先调用mCheckBox.setChecked设置状态,从而导致之前创建的View回调了之前设置的listener,正确的顺序应该是颠倒过来。

    mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                       itemData.isSelected = isChecked;
                }
    });
    

    mCheckBox.setChecked(itemData.isSelected);
    先设置Listener再设置状态。

    相关文章

      网友评论

          本文标题:RecyclerView回收复用引起的checkbox状态改变回

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