android - 使用 LiveData 更新实现 FirestoreQuery:Android Firestore RecyclerView
问题描述
如何通过获取实时更新或更改来使用 LiveData 实现 Firestore 查询?
之前我使用的是单个文档快照,这对我来说很好,但现在我想处理文档列表或查询。
单个文档的实现如下所示(工作):
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")!!))
}
} }
视图模型实现:
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 转换为 List 并更新现有列表或 RecyclerView?
解决方案
为了解决这个问题,让你的FirestoreQueryLiveData
类扩展 LiveData<List> 并改变你的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 类型的 List,现在可以在您的适配器中使用它来在 UI 中显示数据。
推荐阅读
- sql - 如何创建包含 JSON 的列,该列的名称从另一个表中的列的值定义?
- python - python中折线图的数据标签
- neo4j - 如何查询 Neo4j 节点以及节点之间的关系?
- c# - Bot Framework - 使用自定义语音服务错误 400 C#
- bash - 源激活不适用于 conda,PATH 可能存在问题,使用 mac
- android - todo-mvvm-xxx - 视图模型之间的通信
- php - 如何使用 PDO 回显表中的每个项目?
- entity-framework - Entity Framework Core 2.1 在左连接上抛出 ArgumentException
- c# - 从 SQL 表中获取数据到空变量
- coldfusion -
锁定生产 Lucee