如何使用 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)
}
要在回收器视图中获得更精细的更新(和动画),您需要调用 notifyItemInserted
、notifyItemChanged
、notifyItemMoved
和 notifyItemRemoved
方法在适配器上,而不是 notifyDataSetChanged
。调用这些方法可为适配器提供此类更新所需的信息。
如您所见,您需要指定这些调用的位置,这意味着您必须保留从数据库中获取的 data/snapshots 到它们在view/adapter.
如果您想查看如何执行此操作的示例,请查看 FirebaseUI 库中的 FirebaseRecyclerAdapter
class,它的功能几乎完全相同。
我想在添加具有流畅动画的新项目(聊天项目)时更新 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)
}
要在回收器视图中获得更精细的更新(和动画),您需要调用 notifyItemInserted
、notifyItemChanged
、notifyItemMoved
和 notifyItemRemoved
方法在适配器上,而不是 notifyDataSetChanged
。调用这些方法可为适配器提供此类更新所需的信息。
如您所见,您需要指定这些调用的位置,这意味着您必须保留从数据库中获取的 data/snapshots 到它们在view/adapter.
如果您想查看如何执行此操作的示例,请查看 FirebaseUI 库中的 FirebaseRecyclerAdapter
class,它的功能几乎完全相同。