Firebase 实时数据库、ListAdapter、DiffUtil 和 ViewModel
Firebase Realtime Database, ListAdapter, DiffUtil and ViewModel
我正在尝试使用 Recycler View
创建列表视图并显示列表。假设我要显示的内容类似于典型的聊天屏幕 - 图片、消息、sender_name 等
所有这些数据都存储在 Firebase 实时数据库中。我也在使用 ViewModel
并想使用 DiffUtil
来提高效率——因为可以删除、编辑、加星标、添加新消息等。由于 DiffUtil
,我正在使用ListAdapter
.
我面临的问题是 ListAdapter
需要 List
而我使用 ChildEventListener
。
我现在如何使用 LiveData
观察来自 Firebase 的更改,然后更新我的列表以便我可以传回我的 DiffUtil
?因此,如果我添加一条新消息,我希望将其添加到我的 RecyclerView
中,并且我希望使用 DiffUtil
来执行此操作,因为列表也可以更新。
我通过研究发现我可能需要为此目的使用 Room
并观察更改查询 - 所以观察类似 getAllMessages()
方法的东西 return完整列表,然后我可以使用它传递到我的 DiffUtil
。这对我来说听起来有点矫枉过正 - Room
.
的实施
关于如何实现我的需求的任何指示或建议?
这是我的数据库的结构:
如果您敢于开始编写应用程序,您将无法很快与 Room 相处。如果你迈出这一步,SQL知识也是必要的...所以不要害羞,敢于去做
GGK
所以我通过在 ViewModel
.
中执行以下操作解决了这个问题
private val _message = MutableLiveData<List<TextListModel>>()
val message: LiveData<List<TextListModel>>
get() = _message
//...
private val eventListener =
object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {
Timber.e("Error!! ${databaseError.toException()}")
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
val listOfMessages : MutableList<TextListModel> = mutableListOf()
for(msg in dataSnapshot.children) {
val item = msg.getValue(TextListModel::class.java)
listOfMessages.add(item!!)
}
_message.value = listOfMessages
}
}
在我的片段中,我观察 message
并在有更新时执行 adapter.submitList(newList)
。
使用 ValueEventListener
下载数据令人担忧,因为它从节点下提取数据。我正在检查如何将 ChildEventListener
用于我的目的。
编辑
似乎值事件没有下载完整的树!值事件与本地状态中的数据一起使用,并且只下载增量。
中的更多信息
我正在尝试使用 Recycler View
创建列表视图并显示列表。假设我要显示的内容类似于典型的聊天屏幕 - 图片、消息、sender_name 等
所有这些数据都存储在 Firebase 实时数据库中。我也在使用 ViewModel
并想使用 DiffUtil
来提高效率——因为可以删除、编辑、加星标、添加新消息等。由于 DiffUtil
,我正在使用ListAdapter
.
我面临的问题是 ListAdapter
需要 List
而我使用 ChildEventListener
。
我现在如何使用 LiveData
观察来自 Firebase 的更改,然后更新我的列表以便我可以传回我的 DiffUtil
?因此,如果我添加一条新消息,我希望将其添加到我的 RecyclerView
中,并且我希望使用 DiffUtil
来执行此操作,因为列表也可以更新。
我通过研究发现我可能需要为此目的使用 Room
并观察更改查询 - 所以观察类似 getAllMessages()
方法的东西 return完整列表,然后我可以使用它传递到我的 DiffUtil
。这对我来说听起来有点矫枉过正 - Room
.
关于如何实现我的需求的任何指示或建议?
这是我的数据库的结构:
如果您敢于开始编写应用程序,您将无法很快与 Room 相处。如果你迈出这一步,SQL知识也是必要的...所以不要害羞,敢于去做
GGK
所以我通过在 ViewModel
.
private val _message = MutableLiveData<List<TextListModel>>()
val message: LiveData<List<TextListModel>>
get() = _message
//...
private val eventListener =
object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {
Timber.e("Error!! ${databaseError.toException()}")
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
val listOfMessages : MutableList<TextListModel> = mutableListOf()
for(msg in dataSnapshot.children) {
val item = msg.getValue(TextListModel::class.java)
listOfMessages.add(item!!)
}
_message.value = listOfMessages
}
}
在我的片段中,我观察 message
并在有更新时执行 adapter.submitList(newList)
。
使用 ValueEventListener
下载数据令人担忧,因为它从节点下提取数据。我正在检查如何将 ChildEventListener
用于我的目的。
编辑
似乎值事件没有下载完整的树!值事件与本地状态中的数据一起使用,并且只下载增量。
中的更多信息