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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从firestore中删除文档时实时更新Recyclerview?相关的知识,希望对你有一定的参考价值。

我想在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物体,你会如何决定它们中哪两个相等?也许他们会有同样的身份?然后覆盖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找到。

另一答案

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

我刚刚用以下内容替换了adapterList.remove(classElement)

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

感谢@Markus

以上是关于如何从firestore中删除文档时实时更新Recyclerview?的主要内容,如果未能解决你的问题,请参考以下文章

Firestore使用Rest API更新文档字段

如何使用 where 子句从 Firestore 中删除文档

尝试从 Firestore 获取和更新集合时发现“文档集合中未定义”

如何使用flutter从firestore中删除/更新数组对象中的指定索引

如何从云功能中移动 Firestore 文档?

在 Firestore 的集合中删除所有文档时返回所有文档