当我在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中的对象。
答案 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
的更多信息可以在Stackoverflow和Java documentation中找到。