如何在recyclerview-selection库中禁用range selection范围选择功能
禁用recyclerview-selection范围选择功能的实现方法
- 方案1:自定义
SelectionPredicate禁用范围选择逻辑(优先推荐)
范围选择的核心是库会调用canSetStateAtPosition方法批量设置多个条目的选中状态,重写该方法禁止批量设置即可同时屏蔽手势拖拽、Shift+点击触发的范围选择行为,代码示例如下:
// 替换原有默认的SelectionPredicates.createSelectAnything() val customSelectionPredicate = object : SelectionTracker.SelectionPredicate<Long>() { override fun canSetStateForKey(key: Long, nextState: Boolean): Boolean { // 允许单个条目独立切换选中状态 return true } override fun canSetStateAtPosition(position: Int, nextState: Boolean): Boolean { // 禁止批量修改多个条目的选中状态,阻断范围选择的核心逻辑 return false } override fun canSelectMultiple(): Boolean { // 仅需要禁用范围选择、保留普通多选功能就返回true;不需要多选直接返回false即可 return true } } // 构建SelectionTracker时传入自定义Predicate val selectionTracker = SelectionTracker.Builder( "your_selection_id", recyclerView, yourItemKeyProvider, yourItemDetailsLookup, customSelectionPredicate ).build()
- 方案2:拦截Shift触发范围选择的手势
如果只需要屏蔽键盘Shift+点击触发的范围选择,可以自定义OnItemActivatedListener拦截对应事件:
val noRangeSelectionListener = SelectionTracker.OnItemActivatedListener<Long> { item, event -> // 检测到Shift键按下时的点击事件直接拦截,不交给库处理 if (event.isShiftPressed) { return@OnItemActivatedListener true } false } // 构建SelectionTracker时传入该监听器 val selectionTracker = SelectionTracker.Builder( "your_selection_id", recyclerView, yourItemKeyProvider, yourItemDetailsLookup, SelectionPredicates.createSelectAnything() ).withOnItemActivatedListener(noRangeSelectionListener) .build()
注意:如果你使用的是1.2.0及以上版本的recyclerview-selection,上述方案可直接生效;如果是更低版本,优先选择自定义SelectionPredicate的方案,覆盖场景更全面。
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

