使用LiveData更新实现FirestoreQuery:Android Firestore-RecyclerView



如何通过实时更新或更改来实现LiveData的Firestore Query?

早些时候,我使用单个文档快照,这对我来说很好,但现在我想处理文档列表或查询。

单个文档的实现如下所示(工作(:

class ItemLiveData(private val reference: DocumentReference) :
LiveData<Item> () , EventListener<DocumentSnapshot> {
private var registration : ListenerRegistration? = null
override fun onActive() {
super.onActive()
registration = reference.addSnapshotListener(this)
}
override fun onInactive() {
super.onInactive()
registration?.remove()
}
override fun onEvent(value: DocumentSnapshot?, error: FirebaseFirestoreException?) {
value?.let {
setValue(Item(it.id,it.getString("name")!!))
}
} }

ViewModel实现:

private val firestore = Firebase.firestore.collection("cities")
fun getItemLiveData(): ItemLiveData {
return ItemLiveData(firestore.document("IGjSiK0mDVQp20zWqNMD"))
}

好吧,上面给出的代码可以完美地用于单个文档,但如果有查询呢?

我正在尝试实现这样的东西:

class FirestoreQueryLiveData(private val query: Query)
: LiveData<List<DocumentSnapshot>>(), EventListener<QuerySnapshot> {
private lateinit var registration: ListenerRegistration
override fun onActive() {
super.onActive()
registration = query.addSnapshotListener(this)
}
override fun onInactive() {
super.onInactive()
registration.remove()
}
override fun onEvent(value: QuerySnapshot?, error: FirebaseFirestoreException?) {
val documents:List<DocumentSnapshot> = value?.documents as List<DocumentSnapshot>
postValue(documents)
}

}

如果我在代码中的任何地方都犯了错误,请帮帮我?

我的问题是:如何将这些QuerySnapshot强制转换为列表并更新现有列表或RecyclerView?

要解决此问题,请使FirestoreQueryLiveData类扩展LiveData<列表>并更改onEvent()方法的内容,如下所示:

class FirestoreQueryLiveData(
private val query: Query
): LiveData<List<Item>>(), EventListener<QuerySnapshot> {
private lateinit var registration: ListenerRegistration
override fun onActive() {
super.onActive()
registration = query.addSnapshotListener(this)
}
override fun onInactive() {
super.onInactive()
registration.remove()
}
override fun onEvent(value: QuerySnapshot?, error: FirebaseFirestoreException?) {
val items = ArrayList<Item>()
for (doc in value!!) {
doc.toObject(Item::class.java).let {
items.add(it)
}
}
postValue(items)
}
}

现在,您已经向LiveData对象添加了一个类型为Item的列表,现在可以在适配器中使用该列表在UI中显示数据。

最新更新