【问题标题】:Android RecyclerView SelectionTracker clears selection on touch outsideAndroid RecyclerView SelectionTracker 清除外部触摸时的选择
【发布时间】:2019-11-15 15:48:18
【问题描述】:

我正在尝试实现 android 库 SelectionTracker,它允许在 recyclerView 中选择项目。

一切正常,除了当我点击 item (which is in a grid layout),清空所有选择。

我实际上已经找到了调用clearSelection() 的代码。它在 TouchInputHandler 类的第 78 行。 然后它调用 ItemDetailsLookup 的第 64 行,返回 false,因为触摸事件没有发生在项目上。

我想知道是否有人找到了防止这种行为的解决方法,因为我在文档中没有找到任何选项。

这是一个 gridLayout,因此在项目之间留有空间是非常“正常的”,我不希望我的用户因为触摸项目的一侧而清除选择。

【问题讨论】:

  • 嘿,想知道您是否找到了解决方案?
  • 不,对不起!我暂时放弃了这个,但仍然希望得到答案......
  • 您现在可以查看V-master的解决方案了。

标签: android android-recyclerview


【解决方案1】:

这是我的解决方案,基于如果我们预定义 ItemDetail 将用作“这不是您可以选择的视图”。

首先,在您的 ItemDetailsLookup 中而不是返回 null,您可以传递带有区分数据的单个项目,这将确保与您可以拥有的任何其他数据没有名称/位置冲突

class AppItemDetailsLookup(private val rv: RecyclerView) : ItemDetailsLookup<String>() {

    override fun getItemDetails(e: MotionEvent): ItemDetails<String>? {
        val view = rv.findChildViewUnder(e.x, e.y) ?: return EMPTY_ITEM

        return (rv.getChildViewHolder(view) as AppItemViewHolder).getItemDetails()
    }

    object EMPTY_ITEM : ItemDetails<String>() {
        override fun getSelectionKey(): String? = "empty_item_selection_key_that_should_be_unique_somehow_that_is_why_i_made_it_so_long"
        override fun getPosition(): Int = Integer.MAX_VALUE
    }

}

然后,当您使用构建器创建 SelectionTracker 时,而不是使用标准谓词(默认为 SelectionPredicates.createSelectAnything()),您自己会通知无法选择此 EMPTY_ITEM

.withSelectionPredicate(object : SelectionTracker.SelectionPredicate<String>() {
    override fun canSelectMultiple(): Boolean = true
    override fun canSetStateForKey(key: String, nextState: Boolean): Boolean =
        key != AppItemDetailsLookup.EMPTY_ITEM.selectionKey

    override fun canSetStateAtPosition(position: Int, nextState: Boolean): Boolean =
        position != AppItemDetailsLookup.EMPTY_ITEM.position
})

我用 LinearLayoutManger 对其进行了测试,一旦我在其中任何一个项目之外单击,选择就会取消选择所有项目(我的项目没有间距装饰,但它们太少了,我看到最后一个项目下是空的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多