You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何禁用RecyclerView全部子项时会出现部分子项漏禁用的异常情况

异常原因

这个问题的核心是你误解了RecyclerView的运行机制:

  • RecyclerView本身不会把所有列表项都加载到View树中,它只会加载并持有当前屏幕可见+少量离屏预加载的子项View,你调用recyclerView.children拿到的只有这部分存在的子View,滚出屏幕的列表项根本不在这个集合里,自然不会被你遍历修改状态。
  • 你没有把「列表是否可用」的状态存储到全局标记或数据层,RecyclerView滚动时会复用旧的ViewHolder,没有被你之前遍历修改过状态的ViewHolder被复用时,就会保持可点击的状态,所以未禁用的子项位置会随滚动深度变化,完全没有固定规律。

修复方案

不要用遍历子View的方式修改状态,按如下逻辑调整即可:

  1. 在RecyclerView的Adapter中新增全局状态标记:
// 加入你的Adapter类中
var isItemsEnabled: Boolean = true
    set(value) {
        field = value
        notifyDataSetChanged()
    }
  1. 在onBindViewHolder绑定逻辑中,每次都根据这个标记设置子项的可用状态:
override fun onBindViewHolder(holder: YourViewHolder, position: Int) {
    // 原有绑定逻辑不变
    holder.itemView.isEnabled = isItemsEnabled
    holder.checkBox.isEnabled = isItemsEnabled
    // 其他需要禁用的控件也在这里统一设置
}
  1. 点击START按钮时直接修改Adapter的状态即可,不需要遍历RecyclerView:
startButton.setOnClickListener {
    yourAdapter.isItemsEnabled = false
}

内容的提问来源于stack exchange,提问作者Daniel C Jacobs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:06:03