如何从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
的更多信息可以在Stackoverflow和Java documentation找到。
最后我解决了这个问题。问题是,我没有得到正确的对象。
我刚刚用以下内容替换了adapterList.remove(classElement)
:
for (cls in adapterList) {
if (cls.classID == doc.document.id) {
adapterList.remove(cls)
}
}
感谢@Markus
以上是关于如何从firestore中删除文档时实时更新Recyclerview?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 where 子句从 Firestore 中删除文档
尝试从 Firestore 获取和更新集合时发现“文档集合中未定义”