Kotlin中的数据集更改通知()

osh3o9ms  于 2022-12-04  发布在  Kotlin
关注(0)|答案(1)|浏览(147)

我正在为安卓学习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()作为最后的手段。”

jtjikinw

jtjikinw1#

目前建议使用ListAdapter来处理RecyclerView中的动态数据。它是现有RecyclerView适配器的 Package 器。它使用Diff check Util来检查内容是否相同。因此,如果两个项目的内容相同,它将不再重绘视图。2它只在没有现有的绘制视图与当前视图数据匹配时重绘。因此,它将给予与RecyclerView适配器相同的性能。
不需要在ListAdapter中调用notifyDataSetChanged(),这是一个开销较大的操作。
当列表发生变化时,需要调用adapter.submitList(yourList),可以在addValueEventListener中调用。
在activity/fragment中创建适配器时,需要在适配器构造函数中传递ItemDiff对象。
或者可以在调用ListAdapter构造函数时直接创建对象,如下所示。

class RecyclerListAdapter() : ListAdapter<MyModelClass, MyViewHolder>(ItemDiff()){
//Adapter
}

适配器类:

class RecyclerListAdapter(
    itemDiff: ItemDiff
) : ListAdapter<MyModelClass, MyViewHolder>(itemDiff) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(
        )
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {

    }

     class ItemDiff : DiffUtil.ItemCallback<MyModelClass>() {
        override fun areItemsTheSame(oldItem: MyModelClass, newItem: MyModelClass): Boolean {
            return oldItem.uuid == newItem.uuid
        }

        override fun areContentsTheSame(
            oldItem: MyModelClass,
            newItem: MyModelClass
        ): Boolean {
            return oldItem.id == newItem.id &&
                    oldItem.name == newItem.name &&
        }
    }
}

相关问题