如何使用 firebase childEventListener 更新添加了平滑动画的 Recyclerview 新项目?

How to update Recyclerview new item added with smooth animation with firebase childEventListener?

我想在添加具有流畅动画的新项目(聊天项目)时更新 recyclerview UI。 notifyDataSetChanged() 导致整个列表更新有问题的动画。

我正在使用 firebase childEventListenior 在 recyclerview 上显示聊天项。

如果我使用需要位置的 notifyItemInserted() 方法,如何在 onChildAdded() 或 onChildChanged() 方法中获取位置?

我的代码如下:

val childEventListener = object : ChildEventListener {
        override fun onChildAdded(dataSnapshot: DataSnapshot, previousChildName: String?) {
            Log.d("MESSAGE", "onChildAdded:" + dataSnapshot.key!!)
            val message = dataSnapshot.getValue(Message::class.java)
            messageList.add(message!!)
            messageAdapter!!.notifyDataSetChanged()
        }

        override fun onChildChanged(dataSnapshot: DataSnapshot, previousChildName: String?) {
            Log.d("MESSAGE", "onChildChanged: ${dataSnapshot.key}")
        }

        override fun onChildRemoved(dataSnapshot: DataSnapshot) {
            Log.d("MESSAGE", "onChildRemoved:" + dataSnapshot.key!!)
        }

        override fun onChildMoved(dataSnapshot: DataSnapshot, previousChildName: String?) {
            Log.d("MESSAGE", "onChildMoved:" + dataSnapshot.key!!)
        }

        override fun onCancelled(databaseError: DatabaseError) {
            Log.w("MESSAGE", "messages:onCancelled", databaseError.toException())
        }
    }
    messagesDatabaseRef.orderByChild("createdAt").addChildEventListener(childEventListener)
}

要在回收器视图中获得更精细的更新(和动画),您需要调用 notifyItemInsertednotifyItemChangednotifyItemMovednotifyItemRemoved 方法在适配器上,而不是 notifyDataSetChanged。调用这些方法可为适配器提供此类更新所需的信息。

如您所见,您需要指定这些调用的位置,这意味着您必须保留从数据库中获取的 data/snapshots 到它们在view/adapter.

如果您想查看如何执行此操作的示例,请查看 FirebaseUI 库中的 FirebaseRecyclerAdapter class,它的功能几乎完全相同。