代码之家  ›  专栏  ›  技术社区  ›  Shahzad Akram

当文档从firestore中删除时,如何实时更新Recyclerview?

  •  0
  • Shahzad Akram  · 技术社区  · 7 年前

    我想在firestore中添加或删除文档时实时更新Recyclerview。我用这个逻辑

            for (doc in docs!!.documentChanges) {
                val classElement: FireClassModel=doc.document.toObject(FireClassModel::class.java)
    
                if (doc.type == DocumentChange.Type.ADDED) {
                    adapterList.add(classElement)
    
                } else if(doc.type == DocumentChange.Type.REMOVED){
                    adapterList.remove(classElement)
                }
                adapter.notifyDataSetChanged()
            }
    

    它在添加文档时工作正常,但在删除数据时不工作。它没有错误,但不会实时更新。它只在我重新启动应用程序时更新。

    更新

    class FireClassModel {
    
        var classID: String = ""
        var className: String = ""
    
    
    }
    

    我试过了 classesList.contains(classElement) 它返回false。这意味着我无法比较ArrayList中的对象。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Markus Penguin    7 年前

    您的代码看起来不错,但是似乎在那里找不到您试图从列表中删除的元素。

    adapterList.remove(classElement)
    

    使用从列表中删除元素时 remove(o: Object): Boolean 第一个 匹配列表中的元素 equals 方法返回 true .

    listElement == elementToRemove // Kotlin
    listElement.equals(elementToRemove); // Java
    

    默认情况下(这意味着如果不重写 等于 )对象只有在内存中共享同一位置时才会相等。在您的示例中,列表中的元素与您在文档更改侦听器中从Firestore创建的元素位于不同的位置。

    解决方案取决于您的 FireClassModel . 查看多个 FireClass模型 物体,你怎么决定哪两个相等?也许他们会有相同的身份证?然后覆盖 等于 hashCode )并比较使两个对象相同的字段。对于一个id,解决方案可以是这样的(由Android Studio生成):

    class FireClassModel(val id: Int) {
    
        override fun equals(other: Any?): Boolean {
            if (this === other) return true
            if (javaClass != other?.javaClass) return false
    
            other as FireClassModel
    
            if (id != other.id) return false
    
            return true
        }
    
        override fun hashCode(): Int {
            return id
        }
    }
    

    FireClass模型 具有相同ID的对象将返回 . 不覆盖 等于

    可在上找到 Stackoverflow 而在 Java documentation

        2
  •  1
  •   Shahzad Akram    7 年前

    我终于解决了这个问题。问题是,我没有得到正确的对象。

    我刚换了 adapterList.remove(classElement) 包括以下内容:

                for (cls in adapterList) {
                    if (cls.classID == doc.document.id) {
                        adapterList.remove(cls)
                    }
                }