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

问题描述 投票:0回答:2

我想在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中的对象。

android firebase kotlin google-cloud-firestore
2个回答
0
投票

您的代码看起来很好,但似乎您尝试从列表中删除的元素无法在那里找到。

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找到。


1
投票

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

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

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

感谢@Markus

© www.soinside.com 2019 - 2024. All rights reserved.