1

我有一个项目列表,有些项目可以处于“已查看”状态。我希望这些项目与其他项目具有不同的背景颜色。

列表视图基本上有一个用于整个列表的选择器,在其中一个项目上设置背景颜色防止不会起到作用,因为选择器被绘制在我的项目布局下方作为背景并依靠它们是透明的。

有没有办法为列表定义多个选择器?如果不是,是否可以创建一个具有额外状态的选择器?基本上我想要的只是常规列表选择器加上一个额外的状态,即它的 ColorDrawable 在我的 colors.xml 中定义。(因为我不能从 drawable 继承,并且 android 的 list_selector drawables 在 SDK 中不可见供我使用我只想添加一个状态,但是我如何强制使用额外的状态?)

4

2 回答 2

3

找到了答案。我的问题不是选择器的状态,我希望所有项目的选择器处于相同状态!问题是,如果适配器中的某些布尔值为假,我希望该项目是常规的,如果布尔值为真,则颜色为 X,但即使颜色为 X,我仍然希望它在被选中或按下后是透明的。

所以解决方案是以下xml:

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" 
          android:drawable="@android:color/transparent" /> <!-- pressed -->
    <item android:state_selected="true" 
          android:drawable="@android:color/transparent" /> <!-- focused -->
    <item android:drawable="@color/viewed_hotels_color" /> <!-- default -->
</selector>

我发现即使列表本身是获取状态的列表,它确实将状态传递给它的子项(即列表项),我认为它没有这样做。只有 android:focused 在这里无效,android 列表项没有被聚焦而是被选中......所以你可以看到在任何没有被按下或选择的状态下我给我的默认颜色,否则它是透明的并且选择器对所有人都是可见的.

在我的适配器中,我需要以下代码(在 getView() 方法中):

View itemView = convertedView; <- i'll spare you the layout details...
Item item = getItem(position);
if( item.isViewed() ){
    itemView.setBackgroundResource(R.drawable.viewed_item_background);
}else{
    itemView.setBackgroundDrawable(null);
}

这可以确保每个项目都获得正确的背景。当然,如果项目状态更改为已查看并且我希望它显示我需要在适配器上调用 notifyDatasetCahnged()。

于 2011-01-31T09:17:51.660 回答
0

您可以实现您的自定义子类Adapter并覆盖该方法getView()。由于列表调用此方法来获取View单个项目的 ,因此您可以通过覆盖来定义单个列表项的外观getView()。因此,更改已查看项目的背景颜色应该不是问题。

更新

该类扩展AbsListViewListView类有一个名为 的方法setDrawSelectorOnTop()。我认为您可以使用它来控制选择器的行为。

于 2011-01-13T14:13:53.317 回答