1.diffutilԴ?源码?
diffutilԴ??
在开发中,处理 RecyclerView 刷新时,源码手动调用 notifyDataSetChanged() 显得效率低下,源码尤其是源码在动态列表数据发生变化时,仅增删一个项却需刷新整个列表,源码这无疑耗费资源。源码儿童溯源码燕窝产地因此,源码Google 提供了一系列 API 供开发者在局部更新时使用。源码
然而,源码对于某些场景,源码比如从后台获取的源码全部列表数据,开发者需要对比新旧列表的源码不同,仅更新变化的源码项,这如何实现?这时,源码Google 推出了 DiffUtil 工具,源码它基于 Myers 差分算法,解决开发者需要高效比较列表差异的免费入口源码痛点。
ListAdapter 是 Google 针对 DiffUtil 进行封装的 Adapter 类,开发者只需继承并重写它,即可实现高效的 RecyclerView 刷新。以下为实践步骤:
首先,实现 DiffUtil.ItemCallback,这是整个 ListAdapter 的关键步骤,用于 DiffUtil 确定如何正确修改列表。该方法包含两个:areItemsThewireshark源码详解Same() 和 areContentsTheSame(),前者判断实体类的主键是否相同,后者判断实体类中导致 UI 变化的字段是否相同。
其次,实现 ViewHolder,这与常规 Adapter 没有区别。若项目需求,可使用 viewBinding 提升效率。
最后,selective suspend 源码组合成完整的 ListAdapter,使用泛型(实体类和 ViewHolder 类型)并传入 DiffUtil.ItemCallback。ListAdapter 提供了快速获取项的方法,因此在 onBindViewHolder() 中可直接调用。
使用 ListAdapter 完成列表的增删查改,以下为演示步骤:
开始,准备一个 List 和初始化代码。插入元素,npapi 插件源码无论是插入全新列表还是局部插入,均只需调用 submitList 方法。插入局部元素时,先将列表转为可变列表,插入元素后,调用 submitList 传入新列表,即可实现更新。
为什么使用不可变列表?源码中存在校验差异性逻辑的异步过程,外部修改原列表可能导致内部逻辑异常,故建议传入新列表,而非修改原列表。
删除元素、修改元素及列表清空,均通过 submitList 完成,因为它包含列表的更新信息。如果需要清空列表,只需传入空对象。
对于项目中常见的复杂场景,即新列表与原列表存在修改、删除、插入等操作,开发者需维护这些逻辑,而 ListAdapter 内置的差异性算法自动完成更新工作,大大节省开发时间。
总结,ListAdapter 通过简化差异性更新逻辑,特别适合在返回整段列表后仅更新局部元素的场景,如后台返回列表中仅一两个元素变化,传统方法会导致性能浪费。若项目无法直接使用 ListAdapter,同样可通过 DiffUtil 更新 Adapter,具体实现网上有丰富教程。