我正在为安卓学习Kotlin几个月,我有一个问题要问
private fun configRecoverReservations(){
val dialog: AlertDialog? = SpotsDialog.Builder()
.setContext(requireContext())
.setMessage(getString(R.string.recovering_reservations))
.setCancelable(false)
.build()
dialog?.show()
adUserRef = FirebaseDatabase.getInstance()
.getReference("Reservations")
.child(auth.currentUser!!.uid)
adUserRef.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
reservationList.clear()
for (ds: DataSnapshot in snapshot.children){
reservationList.add(ds.getValue(Reservation::class.java)!!)
}
if(reservationList.isEmpty()) {
binding.recyclerMyReservations.hide()
binding.textEmptyList.show()
}
reservationList.reverse()
dialog?.dismiss()
adapterReservations.notifyDataSetChanged()
}
override fun onCancelled(error: DatabaseError) {
null
}
})
}
如何将是最花哨的方式来改变notifyOnDataSetChanged()
在这种情况下,因为它不是最好的解决方案,因为谷歌说?在这里它说:
通知所有注册的观察者数据集已更改。
有两种不同类别的数据变更事件:项目变更和结构变更。项目变更是指单一项目的数据已更新,但未发生位置变更。结构变更是指在数据集内插入、移除或移动项目。
此事件不指定数据集的哪些部分已更改,强制任何观察者假定所有现有项和结构可能不再有效。将强制LayoutManagers完全重新绑定和重新布局所有可见视图。
使用此方法时,RecyclerView将尝试为报告具有稳定ID的适配器合成可见的结构更改事件。这有助于实现动画和可视对象持久性,但仍需要重新绑定和重新布局单个项目视图。
如果您正在编写适配器,则尽可能使用更具体的更改事件将始终更有效。请将notifyDataSetChanged()作为最后的手段。”
1条答案
按热度按时间jtjikinw1#
目前建议使用ListAdapter来处理RecyclerView中的动态数据。它是现有RecyclerView适配器的 Package 器。它使用Diff check Util来检查内容是否相同。因此,如果两个项目的内容相同,它将不再重绘视图。2它只在没有现有的绘制视图与当前视图数据匹配时重绘。因此,它将给予与RecyclerView适配器相同的性能。
不需要在ListAdapter中调用
notifyDataSetChanged()
,这是一个开销较大的操作。当列表发生变化时,需要调用
adapter.submitList(yourList)
,可以在addValueEventListener
中调用。在activity/fragment中创建适配器时,需要在适配器构造函数中传递
ItemDiff
对象。或者可以在调用ListAdapter构造函数时直接创建对象,如下所示。
适配器类: