ListView - 突出显示项目的子布局

时间:2013-10-26 02:01:26

标签: android listview selector highlight

我一直在寻找这个问题的直接答案。我想知道的是如何在ListView上实现一个自定义突出显示,它只会高亮(顶部,最好是)ListView项目的子布局(在这种情况下,我希望突出显示项目的RelativeLayout)。

以下是我发生的事情的屏幕截图:Fail

以下是list_item.xml的代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="72dp"
android:clickable="false">
<RelativeLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp"
    android:background="@drawable/card_layout">
    <LinearLayout android:id="@+id/linearLayout_thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_vertical">
        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:id="@+id/imageView_thumbnail"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:orientation="vertical"
        android:layout_toRightOf="@+id/linearLayout_thumbnail"
        android:gravity="center_vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView_title"
            android:paddingLeft="5dp"
            android:textSize="18dp"
            android:text="SOME TEXT" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView_subtitle"
            android:paddingLeft="5dp"
            android:textSize="12dp" />
    </LinearLayout>

    <TextView
        android:id="@+id/textView_other"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingRight="12dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"/>
</RelativeLayout>
</FrameLayout>

该图片的ListView代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#e5e5e5">

<ListView android:id="@+id/listView_something"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"
    android:listSelector="@drawable/list_item_selector"
    android:drawSelectorOnTop="true"/>

</LinearLayout>

list_item_selector.xml的代码:

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

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/list_item_selected" android:state_pressed="true"/>
    <item android:drawable="@android:color/transparent" android:state_focused="true"/>
    <item android:drawable="@android:color/transparent"/>
</selector>

这是card_layout.xml的文件:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle"
        android:dither="true">
        <corners android:radius="2dp"/>
        <solid android:color="#ccc" />
    </shape>
</item>

<item android:bottom="2dp">
    <shape android:shape="rectangle"
        android:dither="true">
        <corners android:radius="2dp" />
        <solid android:color="@android:color/white" />
        <padding android:bottom="7dp"
            android:left="5dp"
            android:right="5dp"
            android:top="5dp" />
    </shape>
</item>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/list_item_selected" android:state_pressed="true"/>
    <item android:drawable="@android:color/transparent" android:state_focused="true"/>
    <item android:drawable="@android:color/transparent"/>
</selector>

当我将RelativeLayout的背景切换到ListView正在使用的选择器时,会发生什么,并更改ListView以使其选择器是透明的:Sort of working

因此无论出于何种原因,都不允许card_layout.xml文件在选择器信息之前有两个项目,一切都很奇怪。谁能告诉我这是如何正确实施的? Like Google Play Music(这可能不是最好的例子,因为它看起来像一个GridView或者其他类似的东西)

我是否必须实现GridView才能显示此列表?

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,我不知道它是否是最好的解决方案,但它得到了我想做的。

简单地说,我发现在card_layout.xml文件中添加选择器代码不起作用。你应该做的是为你希望在按钮或列表项上实现的每个状态创建一个布局xml文件,并将该布局嵌入选择器本身,就像这篇SO帖子的答案一样:Android Using layer-list for button selector.

由于我不想找出颜色和透明度,我需要实现三种不同状态的背景我基本上放置了一个RelativeLayout,它位于整个列表项的顶部,作为可选择的该项目的一部分。

此处的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="72dp">
<RelativeLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp"
    android:background="@drawable/card_layout">
    <LinearLayout android:id="@+id/linearLayout_thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_vertical">
        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:id="@+id/imageView_thumbnail"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:orientation="vertical"
        android:layout_toRightOf="@+id/linearLayout_thumbnail"
        android:gravity="center_vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView_title"
            android:paddingLeft="5dp"
            android:textSize="18dp"
            android:text="SOME TEXT" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView_subtitle"
            android:paddingLeft="5dp"
            android:textSize="12dp"
            android:text="SOME TEXT" />
    </LinearLayout>

    <TextView
        android:id="@+id/textView_extra"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingRight="12dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"/>
</RelativeLayout>
<RelativeLayout
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:background="@drawable/list_item_selector"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp"/>
</FrameLayout>

所以,现在这个工作正常,请点击此处:Proper item selection.