具有自定义背景的可选择/可突出显示的列表项

时间:2013-08-21 07:45:38

标签: android android-listview android-xml listviewitem

我有一个ListView项,它有一个背景设置。这将覆盖按下/选择项目时出现的默认蓝色突出显示。有没有办法同时拥有背景和选择器?

这是我尝试合并背景和选择器......

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

    <selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:color="@color/red"/>

    </selector>
    <item>
        <shape
            android:dither="true"
            android:shape="rectangle" >

            <solid android:color="#ccc" />
        </shape>
    </item>
    <item android:bottom="2dp">
        <shape
            android:dither="true"
            android:shape="rectangle" >
            <corners android:radius="6dp" />

            <solid android:color="@android:color/white" />

             </shape>
    </item>

</layer-list>

这是在我的drawable文件夹中,我在ListItem xml中设置它:

android:background="@drawable/my_background

3 个答案:

答案 0 :(得分:1)

要有自定义背景和默认选择器效果(按下/选择时另一个drawalbe)有点困难,经过几次尝试后,我就成功了。

您应该在分隔的xml文件中定义两个选择器:listitem_background.xmllistitem_selector.xml

第一个用于列表项的背景,它会在按下项目并处于正常状态时产生效果。

第二个用于列表的选择器,它将通过将所有状态设置为transparent来摆脱列表视图的默认选择器。

默认选择器效果在第一个xml文件中定义:listitem_background.xml。

首先,你需要一个xml文件来定义一些可绘制的颜色:color_drawable.xml,在res/values目录中:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- The color of the normal state. -->
    <drawable name="listitem_normal">#E671B8</drawable>
    <!-- The two color below show when the item is pressed, you should change that to the color you want. -->
    <drawable name="listitem_pressed">#e7eeab</drawable>
    <drawable name="listitem_selected">#e7eeab</drawable>

</resources>

然后,listitem_background.xml中的res/drawable

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

    <item android:drawable="@drawable/listitem_pressed" android:state_enabled="true" android:state_pressed="true"/>
    <item android:drawable="@drawable/listitem_selected" android:state_enabled="true" android:state_focused="true"/>
    <item android:drawable="@drawable/listitem_selected" android:state_enabled="true" android:state_selected="true"/>
    <item android:drawable="@drawable/listitem_normal"/>

</selector>
{h3>和listitem_selector.xml中的res/drawable
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/android:transparent" android:state_enabled="true" android:state_pressed="true"/>
    <item android:drawable="@color/android:transparent" android:state_enabled="true" android:state_focused="true"/>
    <item android:drawable="@color/android:transparent"/>

</selector>

将listitem_background设置为listitem:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/listitem_background" >

    ...

</RelativeLayout>

将listitem_selector设置为listview:

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:listSelector="@drawable/listitem_selector" />

答案 1 :(得分:1)

看到这再次受到一些关注,我将发布我找到的解决方案(我之前在评论中提到过):

我发现ListView中的android:drawSelectorOnTop="true"解决了这个问题。

答案 2 :(得分:0)

在ListView中使用它来匹配颜色组合

机器人:cacheColorHint = “#e7eeab”