RecyclerView未创建视图不显示数据 适配器核心方法未触发
问题根因
适配器的onCreateViewHolder/onBindViewHolder/getItemCount不触发的核心原因是:你在数据观察回调中操作的是一个全新创建的、未绑定到RecyclerView的适配器实例,而非之前设置给RecyclerView的那个适配器对象。
你在onCreate中确实创建了适配器并绑定给了RecyclerView:
val noteAdapter = NotesRVAdapter(this) notesRV.adapter = noteAdapter notesRV.layoutManager = LinearLayoutManager(this)
但在LiveData数据回调里,你写了NotesRVAdapter(this).updateList(...),这行代码会在每次回调时生成一个独立的新适配器对象,这个新对象从来没有被设置给RecyclerView,你给它传数据、调用刷新方法,RecyclerView完全感知不到——它持有的始终是最开始那个数据为空的适配器实例,自然不会触发任何列表绘制流程。
修复方法
直接修改观察回调里的代码,不要新建适配器实例,调用已经绑定到RecyclerView的noteAdapter对象的更新方法即可:
viewModel.getAllNotes.observe(this) { list -> list?.let { Log.d("TAG","Observing") noteAdapter.updateList(it as ArrayList<NoteEntity>) } }
可选优化项
- 建议将
noteAdapter声明为MainActivity的成员变量,避免后续代码出现作用域访问问题 - 列表刷新优先使用定向刷新方法替代全量刷新的
notifyDataSetChanged(),可以提升列表滑动和刷新性能,参考修改:
fun updateList(list: ArrayList<NoteEntity>){ val oldSize = noteItem.size noteItem.clear() noteItem.addAll(list) if (oldSize == 0) { notifyItemRangeInserted(0, noteItem.size) } else { notifyDataSetChanged() } }
- 布局文件中控件ID使用了大写开头(
Heading/Description/Priority),不符合Android命名规范,建议调整为小写驼峰格式(heading/description/priority),避免后续使用ViewBinding/Kotlin合成属性时出现兼容问题。
内容的提问来源于stack exchange,提问作者Anurag Hale
相关产品推荐
相关产品推荐

