【问题标题】:Firebase Realtime Database, ListAdapter, DiffUtil and ViewModelFirebase 实时数据库、ListAdapter、DiffUtil 和 ViewModel
【发布时间】:2019-11-25 07:45:28
【问题描述】:

我正在尝试使用Recycler View 创建一个列表视图并显示一个列表。假设我要显示的内容类似于典型的聊天屏幕 - 图像、消息、发件人名称等。

因此,所有这些数据都存储在 Firebase 实时数据库中。我也在使用ViewModel,并希望使用DiffUtil 来提高效率——因为可以删除、编辑、加星标、添加新消息等。由于DiffUtil,我使用的是ListAdapter

我面临的问题是ListAdapter 需要List 而我使用ChildEventListener

我现在如何使用 LiveData 观察 Firebase 的变化,然后更新我的列表,以便我可以传回我的 DiffUtil?因此,如果我添加一条新消息,我希望将其添加到我的RecyclerView,并且我想使用DiffUtil 来执行此操作,因为列表也可以更新。

我通过研究发现,我可能需要为此目的使用 Room 并观察查询的变化 - 所以观察类似 getAllMessages() 的方法,它会返回完整的列表,然后我可以使用它来传递给我的DiffUtil。这对我来说听起来有点矫枉过正——Room 的实现。

关于如何实现我的需求的任何指示或建议?

这是我的数据库的结构:

【问题讨论】:

    标签: firebase android-recyclerview android-livedata android-diffutils android-listadapter


    【解决方案1】:

    如果您敢于开始编写应用程序,您将无法很快与 Room 相处。如果你迈出这一步,SQL知识也是必不可少的……所以不要害羞,大胆去做

    GGK

    【讨论】:

      【解决方案2】:

      所以我通过在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

      【讨论】:

        猜你喜欢
        • 2021-11-08
        • 1970-01-01
        • 2021-07-20
        • 2020-07-05
        • 2021-07-01
        • 1970-01-01
        • 2020-12-29
        • 2018-08-21
        • 2017-12-16
        相关资源
        最近更新 更多