You need to enable JavaScript to run this app. Firestore获取数据成功但RecyclerView显示为空是什么原因?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 14:57:03