如何使用选择器设置初始ListView项目背景颜色

时间:2014-07-09 17:37:48

标签: android android-layout listview

我无法绕过这个,我想将列表视图项的初始背景颜色设置为灰色,但是在我第一次选择(并取消选择)后,它们只采用正确的背景颜色。在第一个item定义中未正确配置哪些属性?

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

还尝试直接设置列表视图项的背景,但选择器不再具有任何效果。

5 个答案:

答案 0 :(得分:3)

  • 对于列表项,定义选择器drawable:

<强> RES /抽拉/ list_item_background.xml

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

    <item android:state_enabled="true" android:state_pressed="true" android:drawable="@color/red" /> <!-- Pressed state -->
    <item android:state_enabled="true" android:state_focused="true" android:drawable="@color/black" /> <!-- Focused state -->
    <item android:state_enabled="true" android:state_selected="true" android:drawable="@color/orange" /> <!-- Selected state -->
    <item android:drawable="@color/gray" /> <!-- Default state -->    

</selector>
  • 将上述drawable设置为单个列表项的背景:

<强> RES /布局/ list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:background="@drawable/list_item_background" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listitem" />

</LinearLayout>
  • 使用上述自定义布局创建列表项:

    String[] mStrings = {"One", "Two", "Three", "Four"}; ListView list = (ListView) rootView.findViewById(R.id.list); list.setAdapter(new ArrayAdapter<String>(this.getActivity(), R.layout.list_item, R.id.listitem ,mStrings));

答案 1 :(得分:1)

我建议尝试使用以下定义:

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

State List Drawables尝试按顺序匹配。如果你想在许多情况下使用“默认”drawable,它应该是最后一个,没有状态标志。来自docs

  

在每次状态更改期间,状态列表从上到下遍历   并且使用与当前状态匹配的第一个项目   选择不是基于“最佳匹配”,而只是第一项   符合国家最低标准。

答案 2 :(得分:1)

还尝试直接设置列表视图项的背景,但是选择器不再具有任何效果

如果我没有弄错,选择器将被列在列表项后面(默认情况下)。由于您将纯灰色设置为列表项,因此选择器中的红色不会显示。您可以通过更改定义@color/grey的方式来确认这一点 - 尝试为其添加低Alpha值。在这种情况下,红色应该通过。

您当然可以通过设置android:drawSelectorOnTop="true"来更改此行为 - 默认为false。但是,当选择器被绘制在顶部时,列表项将被隐藏。

无论如何 - 根据您的说法,您希望项目在按下时具有@color/red背景,否则为@color/grey背景。

查看以下内容是否满足您的要求:

列表项视图的选择器

<?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"/>
    <item android:drawable="color/grey" />
</selector>

对于listSelector属性,仅提供颜色值:

<ListView
    ....
    ....
    android:listSelector="@color/red" >
</ListView>

简而言之,按下列表项时,项目背景颜色为transparent - 允许listSelector red color可见。在所有其他情况下,grey颜色可见。

答案 3 :(得分:1)

您需要在drawable文件夹

下创建一个listselector.xml
 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
     android:state_selected="false"
        android:state_pressed="false"
        android:drawable="@drawable/gradient_bg" />

    <item android:state_pressed="true"
        android:drawable="@drawable/gradient_bg_hover" />

    <item android:state_selected="true"
     android:state_pressed="false"
        android:drawable="@drawable/gradient_bg_hover" />
</selector>

然后在列表视图中添加:

 <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:divider="#b5b5b5"
        android:dividerHeight="1dp"
        android:listSelector="@drawable/listselector" />

答案 4 :(得分:0)

选择器应类似于下面的选择器:

List_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
     android:state_selected="false"
        android:state_pressed="false"
        android:drawable="@drawable/gradient_bg" />

    <item android:state_pressed="true"
        android:drawable="@drawable/gradient_bg_hover" />

    <item android:state_selected="true"
     android:state_pressed="false"
        android:drawable="@drawable/gradient_bg_hover" />
</selector>

然后在drawables文件夹中,您需要创建以下2个文件:

gradient_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

  <gradient
      android:startColor="#cfcfcf"
      android:centerColor="#737374"
      android:endColor="##3e3e3e"
      android:angle="270" />
</shape>

gradient_bg_hover.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
  <gradient
      android:startColor="#7f0000"
      android:centerColor="#660000"
      android:endColor="#4c0000"
      android:angle="270" />
</shape>

最后,在listview中,您需要添加以下代码行:

android:background="@drawable/list_selector"

希望这会有所帮助:)