从 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()
来监听数据库的更改,但 mAdapter
是 oncreate()
中的一个局部变量,并且此回收器视图中的数据实时更新并不重要,当活动启动很多。
这不起作用:
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 访问特定字段