Android Studio Kotlin中notifyItemChanged未调用onBindViewHolder问题
问题根源及修复方案
核心问题
你所有调用notifyItemChanged的代码,都在操作全新创建的GridAdapter实例,和RecyclerView已经绑定的适配器完全不是同一个对象,自然无法触发刷新回调。
其他隐藏问题
- 类成员变量
recyclerView被局部变量遮蔽:你在类顶部声明了private lateinit var recyclerView: RecyclerView,但在onCreateView中又重新定义了局部变量val recyclerView = view.findViewById(...),导致类成员的recyclerView始终未初始化,后续如果用到会直接崩溃。 - 手动调用
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
相关产品推荐
相关产品推荐

