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 用于我的目的。

编辑

似乎值事件没有下载完整的树!值事件与本地状态中的数据一起使用,并且只下载增量。

Youtube Video from 2016!

中的更多信息