【问题标题】:Implement FirestoreQuery with LiveData updates : Android Firestore RecyclerView使用 LiveData 更新实现 FirestoreQuery:Android Firestore RecyclerView
【发布时间】:2021-05-11 14:21:36
【问题描述】:

如何通过获取实时更新或更改来使用 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")!!))
    }
} }

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 转换为 List 并更新现有列表或 RecyclerView?

【问题讨论】:

  • 您是否尝试将List&lt;DocumentSnapshot&gt; 转换为List&lt;Item&gt; 并将其传递给您的适配器?
  • 怎么做,因为它是一个列表,它在观察者中返回 List

标签: android firebase kotlin google-cloud-firestore


【解决方案1】:

要解决这个问题,请让您的 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 类型的 List,现在可以在您的适配器中使用以在 UI 中显示数据。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 2018-11-10
  • 2021-09-26
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多