为何禁用RecyclerView全部子项时会出现部分子项漏禁用的异常情况
异常原因
这个问题的核心是你误解了RecyclerView的运行机制:
- RecyclerView本身不会把所有列表项都加载到View树中,它只会加载并持有当前屏幕可见+少量离屏预加载的子项View,你调用
recyclerView.children拿到的只有这部分存在的子View,滚出屏幕的列表项根本不在这个集合里,自然不会被你遍历修改状态。 - 你没有把「列表是否可用」的状态存储到全局标记或数据层,RecyclerView滚动时会复用旧的ViewHolder,没有被你之前遍历修改过状态的ViewHolder被复用时,就会保持可点击的状态,所以未禁用的子项位置会随滚动深度变化,完全没有固定规律。
修复方案
不要用遍历子View的方式修改状态,按如下逻辑调整即可:
- 在RecyclerView的Adapter中新增全局状态标记:
// 加入你的Adapter类中 var isItemsEnabled: Boolean = true set(value) { field = value notifyDataSetChanged() }
- 在
onBindViewHolder绑定逻辑中,每次都根据这个标记设置子项的可用状态:
override fun onBindViewHolder(holder: YourViewHolder, position: Int) { // 原有绑定逻辑不变 holder.itemView.isEnabled = isItemsEnabled holder.checkBox.isEnabled = isItemsEnabled // 其他需要禁用的控件也在这里统一设置 }
- 点击START按钮时直接修改Adapter的状态即可,不需要遍历RecyclerView:
startButton.setOnClickListener { yourAdapter.isItemsEnabled = false }
内容的提问来源于stack exchange,提问作者Daniel C Jacobs
相关产品推荐
相关产品推荐

