【问题标题】:Firebase Firestore recycler view adapter duplicates the list for every documentFirebase Firestore 回收器视图适配器复制每个文档的列表
【发布时间】:2019-10-16 03:00:49
【问题描述】:

我正在学习编码并尝试关注 YT 上的 Kotlin messenger 系列“让我们构建那个应用程序”。

我一直坚持使用 Groupie 实现回收器视图,并且无法完全复制代码,因为该系列使用的是较旧的 firebase 数据库,而我正在使用 firestore。

我快到了,但我的“切换农场视图”的“农场”列表将每个项目复制 6 次,这是集合中的文档数量(即,我得到每个农场名称的 6 个副本,而不是只需 1)。

我认为这一定很容易解决,但我想不通。

我认为问题出在这里:

    private fun fetchFarms() {
    val db = FirebaseFirestore.getInstance()
    val adapter = GroupAdapter<GroupieViewHolder>()
    db.collection("farms").get().addOnSuccessListener { result ->
        for (document in result) {
            result.forEach {
            Log.d("SwitchFarmActivity","Loaded document: ${document.id} => ${document.data}")
            val farm = it.toObject(Farm::class.java)
            adapter.add(FarmItem(farm))
                }
            }
        recyclerview_switchfarm.adapter = adapter
    }
}

日志打印输出实际上是每个项目返回两个,然后是一系列的 'ViewPostIme 指针 0' 'ViewPostIme 指针 1' 'ViewPostIme 指针 0' 'ViewPostIme 指针 1'.. 等

生成的“农场”类非常基础:

data class Farm(val farmId: String, val farmName: String, val ownerId: String) {
constructor():this("","","")

}

这是 FarmItem 类:

class FarmItem(val farm: Farm): Item<GroupieViewHolder>() {
override fun bind(viewHolder: GroupieViewHolder, position: Int) {
    viewHolder.itemView.farmName_textView_switchFarm.text = farm.farmName
}
override fun getLayout(): Int {
    return R.layout.farm_row_switch_farm
}

【问题讨论】:

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


    【解决方案1】:

    试试看。

    private fun fetchFarms() {
    val farmList = mutableListOf<Farm>()
    val db = FirebaseFirestore.getInstance()
    val adapter = GroupAdapter<GroupieViewHolder>()
    recyclerview_switchfarm.adapter = adapter
    db.collection("farms").get().addOnSuccessListener { result ->
        for (document in result) {
            result.forEach {
            Log.d("SwitchFarmActivity","Loaded document: ${document.id} => ${document.data}")
            val farm = it.toObject(Farm::class.java)
            farmList.add(farm)
                }
            }
    
    }
    adapter.addItems(farmList)
    }
    

    在 GroupAdapter 创建方法 addItems

        fun addItems(list: List<Farm>) {
        itemList.addAll(list)
        notifyDataSetChanged()
      }
    

    【讨论】:

    • 您好,我在 处收到一个错误,提示类型不匹配发现“农场”需要“农场项目”。另外,您能否更具体地说明 addItems 方法的放置位置?那是在 FarmItem 类中吗?将此类添加到问题正文中。
    • 再次感谢您,该错误已修复,但我仍然不明白将 addItems 函数放在哪里,而且现在没有对 FarmItem 类的引用?
    【解决方案2】:

    好的,我想我有一个解决方案,感谢 Nguyễn 为我指明了正确的方向。

        private fun fetchFarms() {
        Log.d("SwitchFarmActivity","fetchFarms function called")
        val db = FirebaseFirestore.getInstance()
        val adapter = GroupAdapter<GroupieViewHolder>()
        recyclerview_switchfarm.adapter = adapter
        db.collection("farms").get().addOnSuccessListener { result ->
            val farmList = result.toObjects(Farm::class.java)
            farmList.forEach {
                Log.d("SwitchFarmActivity","Loaded document: $it")
                adapter.add(FarmItem(it))
            }
    
        }
    }
    

    如果有人有重构建议,请分享。我仍然不太明白为什么(对于结果中的文档)运行 36 次而不是 6 次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      相关资源
      最近更新 更多