You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Firebase拉取数据填充MutableList后仍为空 RecyclerView无法运行如何解决

问题核心原因
  1. Firebase数据库操作是异步逻辑,你当前写的retrieveData函数会在监听器触发前直接返回刚创建的空列表,所以你拿到的oldList永远是空值,转换后的newList自然也没有数据。
  2. retrieveAndPopulate函数没有定义返回值,你调用val newList = retrieveAndPopulate()拿到的是Unit类型,根本不是你想要的列表数据。
  3. 数据拉取逻辑存在冗余和错误:你在addValueEventListener的回调里又调用了一次ref.get()做重复请求,同时遍历子节点时取的是顶层snapshot的值而非当前遍历到的子节点的值,会导致数据解析错误。
修复步骤

1. 调整数据拉取逻辑,用回调处理异步结果

fun retrieveData(onSuccess: (List<OldListModel>) -> Unit, onFailed: () -> Unit) {
    val ref = FirebaseDatabase.getInstance().getReference("/storage")
    // 单次拉取数据直接用get()即可,如需实时监听数据变化再用addValueEventListener
    ref.get().addOnSuccessListener { snapshot ->
        if (snapshot.exists()) {
            val list = mutableListOf<OldListModel>()
            for (child in snapshot.children) {
                // 取当前遍历子节点的值,而非顶层snapshot的值
                val item = child.getValue(OldListModel::class.java)
                item?.let { list.add(it) }
            }
            onSuccess(list)
        } else {
            onFailed()
        }
    }.addOnFailureListener {
        onFailed()
    }
}

2. 调整RecyclerView初始化和数据填充逻辑

先初始化RecyclerView和适配器,等异步数据返回后再更新列表、通知适配器刷新:

private lateinit var adapter: AdapterAdapter
private val newList: MutableList<NewListModel> = mutableListOf()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.your_activity_layout)
    // 提前初始化RecyclerView和适配器
    val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
    recyclerView.layoutManager = LinearLayoutManager(this)
    adapter = AdapterAdapter(newList)
    recyclerView.adapter = adapter

    // 异步拉取数据
    retrieveData(
        onSuccess = { oldList ->
            // 转换旧数据到新模型
            val convertedList = oldList.map { oldItem ->
                NewListModel(
                    itemOne = oldItem.itemOne,
                    itemTwo = oldItem.itemTwo,
                    itemThree = oldItem.itemThree,
                    itemFour = oldItem.itemFour
                )
            }
            // 更新列表并通知适配器刷新
            newList.clear()
            newList.addAll(convertedList)
            adapter.notifyDataSetChanged()
            // 如果你的适配器继承自ListAdapter,直接调用adapter.submitList(convertedList)即可,无需手动更新列表和通知
        },
        onFailed = {
            Log.d("Data", "Retrieving data was unsuccessful.")
        }
    )
}
注意事项
  • 如果需要实时监听数据库数据变化,把get()替换为addValueEventListener即可,数据转换和刷新逻辑不变。
  • 不要在主线程做同步等待异步请求返回的操作,会导致界面卡顿ANR,所有异步返回后才需要执行的逻辑都放到回调中处理。

内容的提问来源于stack exchange,提问作者callMe_whatever

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:54:00