android - 从Firestore中删除文档后,如何实时更新Recyclerview?

标签 android firebase kotlin google-cloud-firestore

从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),它返回false。这意味着我无法比较ArrayList中的对象。

最佳答案

您的代码看起来不错,但似乎无法在此处找到您要从列表中删除的元素。

adapterList.remove(classElement)

当使用remove(o: Object): Boolean从列表中删除元素时,列表中的第一个匹配元素将被删除。匹配元素是equals方法返回true的元素。
listElement == elementToRemove // Kotlin
listElement.equals(elementToRemove); // Java

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

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

关于android - 从Firestore中删除文档后,如何实时更新Recyclerview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52483653/

相关文章:

android - @Parcelize 注解和继承

android - DOM - 从节点解析文本

android - Android-错误:任务 ':app:transformClassesWithDexForRelease'的执行失败

javascript - Angular.js 中的 ng-repeat 未按预期工作

android - Firebase onTokenRefresh() 未被调用

android - 为什么在给定 List<List<Any>> 时,参数化 JUnit 测试会抛出 IllegalArgumentException,但适用于 List<Array<Any>>

java - 安卓 watch : 'cannot resolve symbol' error on GregorianCalendar?

android - crtbegin.o 和 crtbegin_dynamic.o 是什么?

ios - 快速将动态 firebase 键转换为字典

stream - RxJava - 将 Observable 转换为迭代器、流或序列