在 RecyclerView 条目数超过一屏时,下拉滚动导致 checkbox 状态混乱

发布时间: 2021-03-12 21:14:37 作者: 大象笔记

Bug 现象

陪媳妇在医院生二娃的时候,用自己新开发的一个 Todo 管理的 Android App 记录待办事宜。当待办事项列表条目很多,超过一屏,此时下拉滚动查看更多事项,会发现这些待办事项的完成状态发生错乱。并且引发我的壁纸生成机制被频繁触发,功能失效。。。

由于记录的事情太多也很重要,引起极度不适,气得我差点卸载,给自己 Google Play 上 1 星差评。

导致 checkbox 状态混乱的原因

为了节省内存,RecyclerView 滚动时,会将移出可视范围、不可见的条目做回收。

如果条目中 (View Holder)包含 CheckBox,在回收时,会自动将 CheckBox uncheck,于是就触发了 CheckBox 状态变更的监听事件。这个监听事件是我在

onBindViewHolder 中指定 holder.binding.checkBox.setOnCheckedChangeListener。

解决方法 (Kotlin)

在 ListAdapter 中 override onViewRecycled 函数,在回收前,将监听事件取消。

override fun onViewRecycled(holder: TodoViewHolder) {
    holder.binding.checkBox.setOnCheckedChangeListener(null);
    super.onViewRecycled(holder)
}

是时候尝试一下Jetpack Compose 了

吐槽一下,感觉上 RecyclerView 的心智负担太重了。体现在:

查了一下 Jetpack Compose 对应的 RecyclerView 实现就简单很多,希望赶紧出正式版。

参考

我是一名山东烟台的开发者,联系作者