能否将DiffUtil/AsyncListDiffer与List以外的集合(如LinkedHashSet)配合使用?
可行性分析
完全可以,但前提是你的业务场景匹配LinkedHashSet的特性:
- 自动去重:重复的Uri会被自动过滤,不会保留多个实例
- 保留插入顺序:元素遍历顺序和插入顺序一致,和ArrayList的有序特性对齐,不会打乱RecyclerView的条目展示顺序
如果你的业务需要允许重复Uri存在,那LinkedHashSet不适用;反之则可以放心替换。
改动幅度分析
改动不算大,主要集中在数据转换和Adapter与AsyncListDiffer的交互层,核心的DiffUtil、ViewHolder、通用Adapter逻辑基本无需修改:
数据传递适配:AsyncListDiffer的
submitList()仅接受List类型,所以每次更新数据时,需要把LinkedHashSet转换成List传入,示例代码:LinkedHashSet<Uri> uriSet = ...; asyncListDiffer.submitList(new ArrayList<>(uriSet));建议不要频繁重复转换,可在Set更新时同步生成对应的List副本,减少性能损耗。
Adapter数据源访问:LinkedHashSet不支持按索引直接获取元素,所以Adapter的
getItem(int position)、getItemCount()方法要基于转换后的List实现。如果依赖AsyncListDiffer,可直接复用它内部维护的List,无需额外处理。DiffCallback逻辑微调:如果之前的DiffCallback已经用
Uri.equals()正确判断条目是否相同(areItemsTheSame)和内容是否一致(areContentsTheSame),这部分完全不用改。唯一需要注意的是,Set自动去重后,DiffUtil不会再检测到重复条目变更,符合业务预期即可。业务逻辑适配:如果原有代码依赖List特性(比如按索引修改元素、主动添加重复Uri),需要调整这些逻辑。比如添加元素时改用
LinkedHashSet.add(),重复添加会被自动忽略。
总结
只要业务场景适配LinkedHashSet的去重+有序特性,替换的改动幅度中等,核心的RecyclerView、DiffUtil、通用Adapter/ViewHolder逻辑基本无需改动,主要是调整数据层的转换和交互逻辑。
内容的提问来源于stack exchange,提问作者Red M

