如何在ListView中突出显示所选项目?

问题描述 投票:0回答:7

我知道android在TouchMode下不会突出显示任何内容。但我正在做类似于 gmail 应用程序的事情,您可以从左侧选择内容并在活动的右侧显示详细信息(想知道 Google 是如何做到这一点的)。

所以故事是我必须突出显示左侧 ListView 上选择的内容。我发现了一些类似的问题,解决方案基本上是:

1.覆盖适配器的getView方法和选定位置的setBackground方法

2.在ItemClick上设置视图的背景并清除它以进行其他选择

但由于一种奇怪的行为,它们都不适合我:当我单击一个项目并突出显示它时,它后面的第五个项目也会突出显示,依此类推,当我向下滚动列表时。

有什么建议吗?谢谢!

android android-listview
7个回答
23
投票

使用listView.setChoiceMode(int choiceMode);

参数

choiceMode 来自 android.widget.AbsListView 类的 CHOICE_MODE_NONE、CHOICE_MODE_SINGLE 或 CHOICE_MODE_MULTIPLE 之一

http://developer.android.com/reference/android/widget/AbsListView.html#setChoiceMode(int)

还需要添加MultiChoiceModeListener,可以有CHOICE_MODE_SINGLE

(android.widget.AbsListView.MultiChoiceModeListener)

请参考下面的示例

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List16.html


16
投票

这适用于自定义列表活动或 ListFragment

在 ListView 中突出显示所选项目

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long arg3)
{

    for(int a = 0; a < parent.getChildCount(); a++)
    {
        parent.getChildAt(a).setBackgroundColor(Color.TRANSPARENT);
    }

    view.setBackgroundColor(Color.GREEN);
}

2
投票

////@drawable/list_selector

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

<item android:drawable="@drawable/list_item_bg_normal"
 android:state_pressed="false" android:state_selected="false" android:state_activated="false"/>

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

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

 <item android:drawable="@drawable/list_item_bg_pressed"
 android:state_activated="true"/>

 </selector>

/////////////////////以及 ListView

 <ListView
    android:id="@+id/list_slidermenu"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/list_selector"
    android:background="@color/list_background"
    android:divider="#060606"/>

////////////////////////listview 项目

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

  <ImageView
  android:id="@+id/icon"
  android:layout_width="35dp"
  android:layout_height="wrap_content"
  android:layout_alignParentLeft="true"
  android:layout_marginLeft="12dp"
  android:layout_marginRight="12dp"
  android:contentDescription="@string/desc_list_item_icon"
  android:src="@drawable/ic_home"
  android:layout_centerVertical="true" />

  </RelativeLayout>

1
投票

突出显示多个项目的原因可能是因为您:重用整个视图,或者将这两个视图的背景设置为同一个 Drawable 实例。如果屏幕上有相同的可绘制对象两次,则第一个发生的所有事件都会发生在所有其他事件上,因为该逻辑是在可绘制对象本身的实例中实现的。

要解决这个问题,要么:不要为多行重复使用 View,或者不要为多行重复使用 Drawable(每次创建一个新的)

我知道这听起来需要大量资源,而且确实如此,但除非您有更好的解决方案,否则这是最简单的解决方案。


0
投票

因为列表视图中的项目模仿顶部的项目,所以它们也模仿它们的背景。您必须在 getView() 函数中设置项目的每一个背景。在 getView() 中的每个项目中,您必须为选定的项目和未选定的项目设置背景。


0
投票

使用它作为列表选择器:

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

还有这个

list_bg

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

选择首选的突出显示颜色


0
投票

您可以使用

setOnItemClickListener
设置点击侦听器并使用您选择的颜色为点击的视图着色:

val listView: ListView = findViewById(R.id.your_id)
listView.setOnItemClickListener {parent: AdapterView<*>, view: View, _, _ ->
    for (a in 0 until parent.childCount) {
        parent.getChildAt(a).setBackgroundColor(Color.TRANSPARENT)
    }
    view.setBackgroundColor(Color.GREEN)
}

这是基于 sudam 的答案,但无需使用已弃用的 ListActivity 即可工作。

© www.soinside.com 2019 - 2024. All rights reserved.