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

更新日期: 2021-03-12 阅读次数: 4135 字数: 395 分类: Android

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 的心智负担太重了。体现在:

  • 一周前写的最简单的 RecyclerView 代码逻辑,我已经看不懂了。。。理顺起来非常耗时
  • 像回收时,checkbox 这种坑感觉不应该是开发人员该去处理的

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

参考

  • https://stackoverflow.com/questions/42159900/checkboxes-gets-unchecked-in-recyclerview-upon-scrolling

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式