不使用androidx.recyclerview.selection自行实现RecyclerView选中功能是否不可取?
方案可行性评估
你提到的在ItemModel中添加isSelected字段实现选中的方案完全不是不可取的方案,恰恰是不需要官方androidx.recyclerview.selection高级特性的中小需求场景下,性价比最高的实现方式。
该方案的优势
- 逻辑直观无学习成本,不需要理解官方库的
SelectionTracker、KeyProvider、ItemDetailsLookup等一系列复杂概念,代码维护成本极低 - 定制自由度极高,你可以完全按照业务需求调整选中逻辑,不需要适配官方库的API约束
- 性能开销极小,仅需要在
onBindViewHolder中判断isSelected字段即可更新条目UI,没有额外的框架层逻辑消耗
实现注意事项
- 点击条目更新状态后,仅需要调用
notifyItemChanged(对应位置)刷新单个条目即可,不要直接调用notifyDataSetChanged全量刷新列表,避免不必要的性能浪费 - 若你的
ItemModel实例会被多个页面全局复用,不要将选中状态直接绑定在模型字段上,避免页面选中状态污染全局数据。这种场景可以单独维护一个Set<唯一ID类型>存储已选中条目的唯一标识,绑定时判断当前条目ID是否存在于该集合中即可 - 实现全选、反选、批量选中这类批量操作时,修改完选中状态后优先使用
notifyItemRangeChanged刷新可视范围条目,不要全量刷新列表 - 条目选中态的UI差异优先使用
StateListDrawable选择器实现,不要在onBindViewHolder中手动写代码修改背景、文字颜色等属性,减少冗余代码
不适用场景
如果你有以下需求,更推荐使用官方androidx.recyclerview.selection库:
- 需要支持Shift批量范围选中、跨列表滚动选中这类复杂交互
- 需要自动兼容屏幕旋转等配置变更时的选中状态持久化
- 需要适配键鼠、触控板操作以及系统辅助功能
内容的提问来源于stack exchange,提问作者Mike Rivera
相关产品推荐
相关产品推荐

