【问题标题】:Recycler View not loading data when retrieved from cloud firestore从 Cloud Firestore 检索时,Recycler View 未加载数据
【发布时间】: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 中的内容之外还有其他内容吗?

标签: android firebase kotlin google-cloud-firestore android-recyclerview


【解决方案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
    }

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2020-12-18
    • 2022-01-03
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多