Android Kotlin Firebase实时数据库:RecyclerView显示空结果

Android Kotlin Firebase实时数据库:RecyclerView显示空结果,android,firebase,firebase-realtime-database,android-recyclerview,kotlin,Android,Firebase,Firebase Realtime Database,Android Recyclerview,Kotlin,当我使用虚拟数据时,我的RecyclerView工作正常,但当连接到Firebase数据库时,会为RecyclerView显示一个空结果。请帮助解决这个问题 override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) var adapter = qponAdapter(generateData())

当我使用虚拟数据时,我的
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)
}
覆盖活动创建的乐趣(savedInstanceState:Bundle?){
super.onActivityCreated(savedInstanceState)
var adapter=qponAdapter(generateData())
val layoutManager=LinearLayoutManager(上下文)
qponRecyclerView?.layoutManager=layoutManager
qponRecyclerView?.itemAnimator=DefaultItemAnimator()
qponRecyclerView?.adapter=适配器
adapter.notifyDataSetChanged()
}
private fun generateData():ArrayList{
var companyReg=Company(name=“qqqq”,br=“”,country=“”,city=“”,address=“”,tel=“”,value=“”,qponQuantity=0,email=“”,advproved=“false”,advPassword=“”,startDate=“”,endDate=“”,conditions=“”,postproved=“false”,order=10000,authophone=“”,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
    }
private fun generateData():ArrayList{
val postListener=对象:ValueEventListener{
覆盖数据更改(dataSnapshot:dataSnapshot){
//获取Post对象并使用这些值更新UI
//val post=dataSnapshot.getValue(post::class.java!!)
// ...
val td=dataSnapshot.value作为HashMap
用于(输入td.键){
val post=td[key]作为HashMap
val companyReg=Company(name=“”,br=“”,country=“”,city=“”,address=“”,tel=“”,value=“”,qponQuantity=0,email=“”,advproved=“false”,advPassword=“”,startDate=“”,endDate=“”,conditions=“”,postproved=“false”,order=10000,authone=“”,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.postproved=post[“postproved”].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(公司名称地址)
companyList.add(companyReg)
}
}
覆盖已取消(databaseError:databaseError){
//获取Post失败,请记录消息
Log.w(标记“loadPost:onCancelled”,databaseError.toException())
// ...
}
}
myRef.addValueEventListener(postListener)
返回公司列表
}
它已连接到Firebase数据库,但RecyclerView显示0记录。
我确信它正在连接到数据库,因为它会打印控制台中的每条记录。

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


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

当您向列表中添加数据时,您需要让适配器知道其数据集已更改。只有这样,它才会重新绘制视图

这意味着在
onDataChange
结束时,您应该调用
notifyDataSetChanged
。比如:

override fun onDataChange(dataSnapshot: DataSnapshot) {
    val td = dataSnapshot.value as HashMap<*, *>

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

        ...

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


        companyList.add(companyReg)
    }

    adapter.notifyDataSetChanged()
}
覆盖数据更改(dataSnapshot:dataSnapshot){
val td=dataSnapshot.value作为HashMap
用于(输入td.键){
val post=td[key]作为HashMap
...
println(companyReg.nodeID)
println(公司名称地址)
companyList.add(companyReg)
}
adapter.notifyDataSetChanged()
}

这很可能意味着您必须使适配器成为类的成员字段,以便在
onDataChange()

中可以访问它。我在fun generateData()中的返回之前添加了QPOnaAdapter(companyList)。notifyDataSetChanged(),但它也显示0条记录。我不知道
QPOnaAdapter()
是什么,但看起来您正在生成一个新的适配器。您需要在Activit中创建的适配器上调用
notifyDataSetChanged