从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
的更多信息,可以在Stackoverflow和Java documentation中找到。
关于android - 从Firestore中删除文档后,如何实时更新Recyclerview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52483653/