首页 > 解决方案 > Android Kotlin Firebase 实时数据库:RecyclerView 显示空结果

问题描述

RecyclerView在使用虚拟数据时工作,但在连接到 Firebase 数据库时显示 RecyclerView 的空结果。请帮助解决这个问题。

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        var adapter = qponAdapter(generateData())
        val layoutManager = LinearLayoutManager(context)
        qponRecyclerView?.layoutManager = layoutManager
        qponRecyclerView?.itemAnimator = DefaultItemAnimator()

        qponRecyclerView?.adapter = adapter
        adapter.notifyDataSetChanged()
}

private fun generateData(): ArrayList<Company> {

    var companyReg = Company(name = "qqqqq", br = "", country = "", city = "", address = "", tel = "", value = "", qponQuantity = 0, email = "", advApproved = "false", advPassword = "", startDate = "", endDate = "", conditions = "", postApproved = "false", order = 10000, authPhone = "",nodeID = "")
    companyList.add(companyReg)
    companyList.add(companyReg)
    companyList.add(companyReg)
    companyList.add(companyReg)
    companyList.add(companyReg)
}

它运行良好并在 Recyclerview 中显示 5 条记录。

private fun generateData(): ArrayList<Company> {
            val postListener = object : ValueEventListener {
                override fun onDataChange(dataSnapshot: DataSnapshot) {
                    // Get Post object and use the values to update the UI
                    //val post = dataSnapshot.getValue<Post>(Post::class.java!!)
                    // ...
                    val td = dataSnapshot.value as HashMap<*, *>



                    for (key in td.keys){
                        val post = td[key] as HashMap<*, *>

                        val companyReg = Company(name = "", br = "", country = "", city = "", address = "", tel = "", value = "", qponQuantity = 0, email = "", advApproved = "false", advPassword = "", startDate = "", endDate = "", conditions = "", postApproved = "false", order = 10000, authPhone = "",nodeID = "")

                        companyReg.name = post["Name"].toString()
                        companyReg.address = post["Address"].toString()
                        companyReg.country = post["Country"].toString()
                        companyReg.city = post["City"].toString()
                        companyReg.tel = post["Tel"].toString()
                        companyReg.value = post["qponValue"].toString()
                        //companyReg.qponQuantity = qponQuantity
                        companyReg.email = post["Email"].toString()
                        companyReg.advPassword = post["advPassword"].toString()

                        companyReg.startDate = post["startDate"].toString()
                        companyReg.endDate = post["endDate"].toString()
                        companyReg.conditions = post["Conditions"].toString()

                        companyReg.postApproved = post["PostApproved"].toString()
                        companyReg.advApproved = post["advApproved"].toString()
                        //companyReg.order = post["Order"] as! Int
                        companyReg.authPhone = post["authPhone"].toString()
                        companyReg.nodeID = key.toString()

                        println(companyReg.nodeID)
                        println(companyReg.address)


                        companyList.add(companyReg)
                    }


                }

                override fun onCancelled(databaseError: DatabaseError) {
                    // Getting Post failed, log a message
                    Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
                    // ...
                }
            }
            myRef.addValueEventListener(postListener)


        return companyList
    }

它连接到 Firebase 数据库,但 RecyclerView 显示 0 记录。我确信它正在连接到数据库,因为它会打印出控制台中的每条记录。

标签: androidfirebasefirebase-realtime-databaseandroid-recyclerviewkotlin

解决方案


您现在无法退回尚未加载的内容。换句话说,您不能简单地在函数companyList外部使用该列表,onDataChange()因为它始终是empty由于该函数的异步行为。这意味着当您尝试在该函数之外使用该列表时,数据尚未完成从数据库加载,这就是无法访问的原因。

解决此问题的一个快速方法是仅在函数内部使用该列表,否则我建议您从这篇文章onDataChange()中查看我的 anwser 的最后一部分,其中我已经解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地理解。它适用于 Android,但同样的原则也适用。


推荐阅读