Firestore获取数据成功但RecyclerView显示为空是什么原因?
问题根源
你的第二种写法的核心问题是引用指向变更导致适配器和Activity持有了不同的列表对象:
- 初始化时你把
Activity的tournamentsList(空列表)传给了适配器,适配器内部的tournamentList变量和Activity的tournamentsList指向同一个内存地址的列表对象 - 第一种写法调用
tournamentsList.add()是直接修改同一个列表对象的内容,适配器内部持有的列表也会同步更新,调用notifyDataSetChanged后就能渲染新内容 - 第二种写法执行
tournamentsList = snapshot!!.toObjects(Tournament::class.java) as ArrayList<Tournament>时,是给Activity的tournamentsList变量重新赋值,让它指向新的列表对象,但是适配器内部持有的还是原来的空列表对象,所以哪怕你调用了notifyDataSetChanged,适配器读取自己持有的列表长度还是0,自然不会渲染内容
修复方案
方案1:修改适配器持有的列表内容,不重新赋值Activity的变量
把第二种写法里的赋值逻辑改成清空原有列表再加新内容:
private fun EventChangeListener() { db = FirebaseFirestore.getInstance() db.collection("tournaments").addSnapshotListener { snapshot, error -> if (error != null) { return@addSnapshotListener } Log.i ("BEFORE", tournamentsList.size.toString()) // 先清空原有列表 tournamentsList.clear() // 把新数据添加到原有列表对象里,不换引用 tournamentsList.addAll(snapshot!!.toObjects(Tournament::class.java)) Log.i ("AFTER ", tournamentsList.size.toString()) tournamentAdapter.notifyDataSetChanged() } }
方案2:给适配器加更新列表的方法,主动更新适配器内部的列表引用
先给适配器加个公开方法:
// 在TournamentListAdapter类中新增 fun updateData(newList: ArrayList<Tournament>) { this.tournamentList = newList notifyDataSetChanged() }
然后在第二种写法的回调里调用这个方法:
private fun EventChangeListener() { db = FirebaseFirestore.getInstance() db.collection("tournaments").addSnapshotListener { snapshot, error -> if (error != null) { return@addSnapshotListener } val newList = snapshot!!.toObjects(Tournament::class.java) as ArrayList<Tournament> tournamentAdapter.updateData(newList) } }
内容的提问来源于stack exchange,提问作者Zonker.in.Geneva
相关产品推荐
相关产品推荐

