0

我有两个可绘制对象用作背景来指示我的列表项的状态(按下或选择)。Pressed drawable 是一个选择器,但没有指定状态;它通过 XML 连接成为列表的 android:listSelector。

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/my_actual_drawable" />
</selector>

然而,Selected drawable 是通过代码应用的,因为它很复杂,并且在选择项目时需要进行不止一个简单的背景可绘制更改。

如果我在两个列表项之间快速单击,则一个项目可以具有(并保持)选定的突出显示,而另一个项目具有(并保持)按下的突出显示。我相信这是因为新闻发生得太快了,以至于底层框架没有将其解释为点击,所以没有onItemClick到达我的列表。

一种解决方案是使用带状态的选择器(这就是选择器的用途!):

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
        android:drawable="@drawable/my_actual_drawable" />
</selector>

但这具有在我的代码可以应用 Selected 突出显示之前关闭 Pressed 突出显示的不幸效果,因此无论onItemClick我在处理程序中多早setBackgroundResource发出调用,两种状态之间都会出现不突出显示。

另一种解决方案是不仅要监视onItemClick事件,还要监视onTouch事件,并在代码中处理所有内容;这似乎使事情变得太慢了。

我该怎么做才能避免闪烁和双选状态?

4

1 回答 1

1

我看到你说你的情况比简单地改变背景绘制更复杂,所以如果我过于简化了,我很抱歉。

为什么不让 xml 选择器处理它所能做的一切呢?您应该能够设置选择器 xml 来处理按下和选择状态以更改背景资源以避免您看到的闪烁和双重选择。我的假设是,如果背景没有做奇怪的事情,你在 java 中做的其他事情足够快以至于不会被注意到。

我喜欢使用android 框架中的 list_selector_background状态列表的可绘制文档作为我做此类事情的参考,尽管 list_selector_background 可能比你需要的复杂一点。

于 2010-09-10T01:39:30.177 回答