Android RecyclerView SelectionTracker在触摸外部时清除选择

Android RecyclerView SelectionTracker在触摸外部时清除选择,android,android-recyclerview,Android,Android Recyclerview,我正在尝试实现android库,它允许在recyclerView中选择项目 一切都很好,只是当我在屏幕外单击时 ,则清除所有选择 实际上,我已经找到了调用clearSelection()的代码。在班级的第78行。 然后调用第64行,该行返回false,因为触摸事件没有在项目上发生 我想知道是否有人找到了防止这种行为的解决方法,因为我在文档中没有找到任何选项 这是一个网格布局,因此在项目之间留有空间是很“正常”的,我不希望我的用户清除选择,因为他们接触到项目的侧面。这是我的解决方案,基于此,如果我

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

一切都很好,只是当我在屏幕外单击时 ,则清除所有选择

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

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


这是一个网格布局,因此在项目之间留有空间是很“正常”的,我不希望我的用户清除选择,因为他们接触到项目的侧面。

这是我的解决方案,基于此,如果我们有预定义的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
    }

}

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

嘿,不知道你是否找到了解决方案?不,对不起!我暂时放下这个,仍然希望得到答案……你现在可以查看V-master的解决方案。
.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
})