我列表中某些项目的颜色不同

时间:2011-01-13 13:45:28

标签: android state add drawable states

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

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

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

2 个答案:

答案 0 :(得分:3)

找到答案。 我的问题不是选择器的状态,我希望选择器处于所有项目的相同状态! 问题是,如果适配器中的项目中的某些布尔值为false,则我希望项目是常规的;如果布尔值为真,我希望颜色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>

我发现即使列表本身是获取状态的那个,它也会将状态传递给它的子项(I.E列表项)我认为它没有。 只有android:聚焦在这里不会有效,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()。

答案 1 :(得分:0)

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

<强>更新

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