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

时间:2018-09-24 16:28:22

标签: android firebase kotlin google-cloud-firestore

当我在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()
        }

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

已更新

FireClassModel:

class FireClassModel {

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


}

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

2 个答案:

答案 0 :(得分:1)

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

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

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

感谢@Markus

答案 1 :(得分:0)

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

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