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

Android Studio Kotlin中notifyItemChanged未调用onBindViewHolder问题

问题根源及修复方案

核心问题

你所有调用notifyItemChanged的代码,都在操作全新创建的GridAdapter实例,和RecyclerView已经绑定的适配器完全不是同一个对象,自然无法触发刷新回调。

其他隐藏问题

  1. 类成员变量recyclerView被局部变量遮蔽:你在类顶部声明了private lateinit var recyclerView: RecyclerView,但在onCreateView中又重新定义了局部变量val recyclerView = view.findViewById(...),导致类成员的recyclerView始终未初始化,后续如果用到会直接崩溃。
  2. 手动调用onBindViewHolder属于错误用法:该方法由RecyclerView框架自动调度,不需要开发者手动调用。

修复步骤

1. 新增适配器类成员变量

在BoardFragment顶部补充成员变量存储已经绑定的适配器实例:

class BoardFragment : Fragment() {
    private lateinit var recyclerView: RecyclerView
    // 新增适配器成员变量
    private lateinit var gridAdapter: GridAdapter
    // 其余原有成员变量不变
    var gridArray = IntArray(400)
    val handler = Handler()
    var isRunning: Boolean = false
    val colorRed = Color.RED
    val colorBlue = Color.BLUE
    ...
}

2. 修正RecyclerView初始化逻辑

修改onCreateView中RecyclerView的初始化代码,取消局部变量遮蔽,同时给成员变量gridAdapter赋值:

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.board_fragment, container, false)
    val startButton = view.findViewById(R.id.start_button) as Button
    // 去掉val,直接给类成员recyclerView赋值
    recyclerView = view.findViewById(R.id.recycler_view) as RecyclerView
    recyclerView.layoutManager = GridLayoutManager(activity, 20)
    // 先初始化成员变量gridAdapter,再设置给RecyclerView
    gridAdapter = GridAdapter()
    recyclerView.adapter = gridAdapter

    startButton.setOnClickListener {
        isRunning = !isRunning
        if (isRunning) {
            testUpdate()
        }
    }
    return view
}

3. 替换所有新建Adapter的通知逻辑

所有需要刷新的地方,都用已经绑定的gridAdapter成员变量,不要新建GridAdapter实例:

修正testUpdate方法:

fun testUpdate() {
    handler.postDelayed({
        if (gridArray[3] == 0) {
            gridArray[3] = 1
        } else {
            gridArray[3] = 0
        }
        if (isRunning) {
            testUpdate()
        }
        // 用成员变量gridAdapter调用notify,不要新建GridAdapter
        gridAdapter.notifyItemChanged(3)
    }, 1000)
}

修正CellViewHolder的点击事件:

init {
    button = cellView.findViewById(R.id.cell_button)
    button.setColorFilter(null)
    button.setOnClickListener {
        if (gridArray[position] == 0) {
            gridArray[position] = 1
        } else {
            gridArray[position] = 0
        }
        // 替换为成员变量gridAdapter,删掉手动调用onBindViewHolder的错误代码
        gridAdapter.notifyItemChanged(position)
    }
}

4. 补充内存泄漏优化(可选)

页面退出时清空Handler的延时任务,避免内存泄漏:

override fun onStop() {
    super.onStop()
    handler.removeCallbacksAndMessages(null)
    isRunning = false
}

内容的提问来源于stack exchange,提问作者Colt Magri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:27:00