从 Cloud Firestore 检索时,Recycler View 未加载数据

Posted

技术标签:

【中文标题】从 Cloud Firestore 检索时,Recycler View 未加载数据【英文标题】:Recycler View not loading data when retrieved from cloud firestore 【发布时间】:2022-01-11 08:17:56 【问题描述】:

我有一个 RecyclerView,当从字符串资源和浮点数数组将数据添加到 myModel 对象时,我的适配器类工作,但在从 firestore 检索这些字符串时不工作。我已经在我的应用程序的其他部分使用 textViews 完成了这项工作。起初我尝试使用toObject<Model>() 填充传递给我的适配器的列表,现在我已经手动从hashMap 中获取数据。我使用了snackbars 来确保数据在传递给我的适配器的列表中。我尝试覆盖 onStart()onstop() 来监听数据库的更改,但 mAdapteroncreate() 中的一个局部变量,并且此回收器视图中的数据实时更新并不重要,当活动启动很多。

这不起作用:

collection.get().addOnSuccessListener  querySnapshot ->
        for (i in 0 until querySnapshot.size())

            val data = querySnapshot.documents[i].data
            val Model = Model()

            val name = data!!["Name"].toString()
            val rating = data!!["Rating"].toString().toFloat()
            Model.Name= name
            Model.Rating = rating




            list.add(Model)

这样做:

    val myImageNameList = arrayOf(R.string.1, R.string.2, R.string.cafe_3, R.string.4, R.string.5, R.string.6, R.string.7, R.8)
    val myImageRatingList = arrayOf(2.4f, 4.1f, 3.6f, 3.4f, 2.8f, 1.9f, 4.1f, 3.9f )

    for (i in 0..7)
        val model = Model()
        model.Name = getString(myImageNameList[i])
        model.Rating = myImageRatingList[i]
        list.add(model)
    

适配器类摘录:

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter.ViewHolder 
    val inflater = LayoutInflater.from(parent.context)
    val v = inflater.inflate(R.layout.row_layout, parent, false)

    return ViewHolder(v)


//bind the data to child views of the ViewHolder
override fun onBindViewHolder(holder: Adapter.ViewHolder, position: Int) 
    val info = imageModelArrayList[position]

    
    holder.txtMsg.text = info.Name
    holder.ratingbar.rating = info.Rating
    holder.ratingDecimal.text = "("+ info.Rating + ")"


//get the max size of the recycler view
override fun getItemCount(): Int 
    return imageModelArrayList.size


inner class ViewHolder(itemView: View):RecyclerView.ViewHolder(itemView), View.OnClickListener
    var txtMsg = itemView.findViewById<View>(R.id.firstLine) as TextView
    var ratingbar = itemView.findViewById<View>(R.id.rating) as RatingBar

我很困惑为什么创建模型对象的第二种方法有效但第一种方法不起作用,据我所知,在这两种情况下,我正在创建一个模型对象并为其字段分配一个字符串和浮动,就在第一个示例中绳子和浮子恰好来自火风暴。

编辑

将 myAdapter 实例化为参数 imageModelArrayList 时传递列表

      val recyclerView = findViewById<View>(R.id.recycler_view) as RecyclerView
    val layoutManager = LinearLayoutManager(this)

    recyclerView.layoutManager = layoutManager


    val imageModelArrayList = populateList()
    val mAdapter = Adapter(imageModelArrayList)
    recyclerView.adapter = mAdapter

【问题讨论】:

在你的第一个代码sn-p中,你如何使用创建的list。你也可以在问题中添加该代码吗? @ArpitShukla 列表作为参数 ImageModelArrayList 已编辑问题传递给 myAdapter 以澄清 list(在 list.add(Model) 中)和imageModelArrayList 是否相同? @ArpitShukla 是的 当您收到来自 firestore 的响应时,即在 addOnSuccessListener 中时,您需要更新您的回收站视图。您的populateList 函数除了您粘贴在第一个 sn-p 中的内容之外还有其他内容吗? 【参考方案1】:

将 recyclerView 传递给收集我的数据的方法,并在我的 addOnSuccessListener 中创建适配器

 val data = querySnapshot.documents[i]
            val model = Model()

            val name = data!!["Name"].toString()
            val rating = data!!["Rating"].toString().toFloat()
            model.Name= name
            model.Rating = rating


            
            list.add(model)
            


        
  
        val mAdapter = Adapter(list)
        recyclerView.adapter = mAdapter
    

【讨论】:

以上是关于从 Cloud Firestore 检索时,Recycler View 未加载数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用颤振和飞镖从 Cloud Firestore 检索特定数据?

如何从Swift中的Cloud FireStore Firebase访问特定字段

在使用 Swift 的 iOS 应用程序中使用 DispatchQueue 等待数据从 Cloud Firestore 返回时遇到问题

如何在 Swift 中从 Cloud FireStore Firebase 访问特定字段

从 documentSnapshot 获取 Cloud Firestore 文档参考

Cloud Firestore 无法检索文档或字段