【问题标题】:How to update Recyclerview in real-time when a document is removed from firestore?从firestore中删除文档时如何实时更新Recyclerview?
【发布时间】:2018-09-24 16:28:21
【问题描述】:

我想在从 Firestore 添加或删除文档时实时更新 Recyclerview。我在 Kotlin:

中使用了这个逻辑
        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()
        }

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

更新

FireClassModel:

class FireClassModel {

    var classID: String = ""
    var className: String = ""


}

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

【问题讨论】:

  • 您说“删除数据时它不起作用”。你有错误吗?
  • 没有错误但不会实时更新..
  • “它不会实时更新”但它确实以任何其他方式更新?还是根本不更新?
  • 当我重新启动应用程序时它会更新。
  • 在这种情况下,请更新您的问题并添加更多代码,例如您使用上述代码的地方。

标签: android firebase kotlin google-cloud-firestore


【解决方案1】:

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

我刚刚将adapterList.remove(classElement) 替换为以下内容:

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

感谢@Markus

【讨论】:

    【解决方案2】:

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

    adapterList.remove(classElement)
    

    当使用remove(o: Object): Boolean 从列表中移除元素时,列表中的第一个匹配元素 将被移除。匹配元素是equals 方法返回true 的元素。

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

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

    解决方案取决于您的FireClassModel。查看多个 FireClassModel 对象,您将如何确定其中两个相等?也许他们会有相同的ID?然后覆盖equals 方法(以及每个合约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
        }
    }
    

    之后比较两个具有相同 ID 的 FireClassModel 对象将返回 true。如果不覆盖 equals 方法,则不会出现这种情况(除非您将对象与自身进行比较)。

    有关equals 的更多信息,请访问StackoverflowJava documentation

    【讨论】:

    • 兄弟,谢谢,现在我明白你的意思了,正如你提到的,我试过这个classesList.contains(classElement),它返回错误。我在我的问题中添加了更多信息,请看一下。
    猜你喜欢
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2018-08-19
    • 2023-03-20
    相关资源
    最近更新 更多