gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:02:35 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

首先,在您的 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对其进行了测试,一旦我在其中任何一个项目之外单击,选择就会取消选择所有项目(我的项目没有间距装饰,但它们太少了,以至于我在最后一个项目下看到空的)

关于Android RecyclerView SelectionTracker 清除外部触摸时的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58880456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com