1

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

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

在切换时,我还检查该索引是否映射到我通过调用获得的稀疏布尔数组中的布尔值

getCheckedItemPositions() 

在列表视图上。如果索引不在选定的项目中,我添加它并调用

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>
4

2 回答 2

0

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

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

这对我有用 f9

于 2015-03-31T12:41:36.000 回答
0

好的,最后经过大量的挠头证明是一个糟糕的设计案例,所以我想我会发布答案,以防其他人不小心做错了。

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

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

于 2015-03-31T16:45:45.640 回答