You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 20:45:07