使用 ChoiceMode multipleChoice 在列表视图上设置选择器

Setting selector on List View with ChoiceMode multipleChoice

我正在使用自定义 SimpleOnGestureListener 来检测长按和单击,我正在我的 ListView 上实现它,它上面有一个选择器。

现在,当长按列表中的项目时,我将启动上下文操作模式,此后每次调用 singleTapUp 时,我都会将项目索引添加到一组选定项目中。我还使用非常基本的集合实现了切换逻辑。

在切换时,我还检查该索引是否映射到我通过调用

获得的稀疏布尔数组中的布尔值
getCheckedItemPositions() 

在 ListView 上。如果索引不在所选项目中,我将其添加并调用

listView.setItemChecked(index, true)

否则我将其从集合中移除并调用

listView.setItemChecked(index, false)

现在我的问题是,当长按时启动操作模式回调的第一个项目没有保持其激活的背景,而我点击之后的所有后续项目都保持不变。

我还观察到,如果我不调用

setItemChecked() 

明确地说,我必须长按每个项目才能保留激活的背景,单击项目不会改变背景。

有人可以帮我想出一个干净的方法来实现我想要实现的目标吗? 任何帮助将不胜感激。

这是我正在使用的选择器 --->

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:state_activated="true"
        android:drawable="@drawable/blue_highlight"/>

    <item android:state_activated="false"
        android:drawable="@drawable/plank_idle"/>

</selector>

将子项目的根布局作为框架布局并将其属性设置为

android:foreground="?android:attr/activatedBackgroundIndicator"

这对我来说很有效

好吧,经过大量的摸索,最终证明是一个糟糕的设计案例,所以我想我会post答案,以防其他人不小心做错了。

我不应该使用 SimpleOnGestureListener 来检测诸如 onSingleTapUp() 和 onLongPress() 之类的基本事件,它们的替代方法可以在 AdapterView class 中找到,它们分别是 OnItemClickListener() 和 OnItemLongClickListener()。

使用这些侦听器,AdapterView 可以有效地处理状态,问题永远不会出现。