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 聊聊, 查看更多联系方式