RecyclerView中onResume调用notifyItemChanged无效问题求助
问题分析与解决
嘿,我一眼就发现问题所在啦!
你在初始化RecyclerView Adapter的时候犯了一个小错误——你创建了两个不同的Adapter实例,导致后续调用notifyItemChanged()的对象和RecyclerView实际绑定的Adapter根本不是同一个,自然看不到更新效果。
具体来看你的onActivityCreated代码:
private lateinit var recyclerView: RecyclerView private lateinit var viewAdapter: RecyclerView.Adapter<*> private lateinit var viewManager: RecyclerView.LayoutManager viewManager = LinearLayoutManager(this) viewAdapter = ListAdapter(mylist) // 第一个Adapter实例 recyclerView = findViewById<RecyclerView>(R.id.recyclerview).apply { setHasFixedSize(true) layoutManager = viewManager adapter=ListAdapter(devicelist).apply { } // 这里又新建了第二个Adapter实例 }
你先给viewAdapter赋值了一个ListAdapter对象,但紧接着给RecyclerView设置adapter时,又重新new了一个全新的ListAdapter。这就导致viewAdapter变量和RecyclerView实际使用的Adapter完全是两个独立的对象,后续在onResume里调用viewAdapter.notifyItemChanged(),根本不会对RecyclerView产生任何影响。
修正后的代码
把RecyclerView的adapter赋值改成直接使用你初始化好的viewAdapter即可:
修改后的onActivityCreated代码
private lateinit var recyclerView: RecyclerView private lateinit var viewAdapter: RecyclerView.Adapter<*> private lateinit var viewManager: RecyclerView.LayoutManager override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewManager = LinearLayoutManager(this) // 注意统一数据源,你原来的mylist和devicelist要保持一致哦 viewAdapter = ListAdapter(devicelist) recyclerView = findViewById<RecyclerView>(R.id.recyclerview).apply { setHasFixedSize(true) layoutManager = viewManager adapter = viewAdapter // 直接用已初始化的viewAdapter,不再新建 } }
优化后的onResume代码
override fun onResume() { super.onResume() val positionData = list[pos.toInt()] // 用安全调用替代!!,避免空指针崩溃 positionData.pos?.let { validPosition -> viewAdapter.notifyItemChanged(validPosition) } }
额外注意事项
- 确保设置更改后,你的数据源
devicelist中对应位置的数据已经正确更新,notifyItemChanged()只是通知RecyclerView重新绘制该位置,真正显示的内容还是来自数据源。 - 尽量避免使用
!!强制解包,用?.let这类安全调用方式能让代码更健壮,减少崩溃风险。
内容的提问来源于stack exchange,提问作者You
相关产品推荐
相关产品推荐

