RecyclerView Adapter中合并两个商品属性列表并对比的实现方案咨询
实现方案
1. 定义统一的对比属性实体类
首先把两款商品的属性统一到同一个实体结构中,方便后续渲染和对比:
// Kotlin示例,Java可按照相同字段定义类 data class CompareAttrItem( val attrName: String, // 统一的属性名,例如"机身重量"、"电池容量" val productAValue: String?, // 第一款商品的属性值,无该属性则存null val productBValue: String? // 第二款商品的属性值,无该属性则存null )
如果两款商品原来的属性实体类的属性名字段命名不一致,需要先对齐字段取值规则。
2. 合并逻辑实现
核心逻辑是对齐属性名,补全两款商品各自缺失的属性值:
- 先将两个属性列表分别转换为
属性名-属性值的键值对Map,降低查找耗时 - 取两个Map的key的并集,得到所有需要展示的属性名
- 遍历所有属性名,分别从两个Map中取值,组装为统一的对比实体,存入新列表
示例代码:
fun mergeCompareAttrs( productAAttrs: List<OriginalAttr>, // OriginalAttr是你原有属性实体类 productBAttrs: List<OriginalAttr> ): List<CompareAttrItem> { val aAttrMap = productAAttrs.associate { it.name to it.value } val bAttrMap = productBAttrs.associate { it.name to it.value } // 取两个商品的所有属性名的并集 val allAttrNames = aAttrMap.keys.union(bAttrMap.keys) // 组装对比列表,可自行添加排序逻辑 return allAttrNames.map { attrName -> CompareAttrItem( attrName = attrName, productAValue = aAttrMap[attrName], productBValue = bAttrMap[attrName] ) } }
Java实现逻辑完全一致,用HashMap存储键值对,再遍历两个keySet的并集组装即可。
3. Adapter渲染逻辑
Adapter直接绑定合并完成的CompareAttrItem列表即可,渲染时如果某一侧属性值为null,可显示无该配置或者留空,方便用户识别差异。
代码放置位置的规范说明
放在Adapter内部是否符合规范
不建议放在Adapter内部处理。
Adapter的核心职责只有列表项的视图绑定和渲染,放入业务逻辑会破坏单一职责原则:后续如果其他页面也需要属性合并能力会出现代码冗余,且合并逻辑放在Adapter中难以单独做单元测试。
如果要在客户端处理合并逻辑,建议把代码放到单独的工具类,或者对应页面的ViewModel/Repository层,合并完成后再把最终渲染列表传给Adapter。
放在服务端处理是否更优
绝大多数场景下放在服务端处理更优:
- 减少多端重复开发:如果Android、iOS、Web都需要做商品对比功能,服务端统一处理一次即可,不需要多端各自实现
- 迭代更灵活:后续要加属性排序、差异高亮、属性分组等需求,服务端直接迭代即可,不需要客户端发版
- 降低客户端出错概率:不需要客户端处理属性名对齐、异常值兼容等问题
仅两种场景适合放在客户端处理:
- 商品属性已经提前缓存在本地,不需要额外请求服务端,且合并逻辑稳定不会频繁变更
- 服务端排期紧张,属于临时上线的对比功能,后续可迭代迁移到服务端处理
内容的提问来源于stack exchange,提问作者reza.fathi921
相关产品推荐
相关产品推荐

