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

我知道android不会突出TouchMode中的任何内容。 但是我正在做一些类似于gmail应用程序的东西,在这个应用程序中,您从左侧select了一些东西,并在活动的右侧显示详细信息(想知道Google是如何做到这一点的)。

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

1.覆盖适配器的getView方法和setBackgroundselect位置

onItemClick的视图的setsetBackground并清除它以供select

但是,由于一个奇怪的行为,他们都没有为我工作:当我点击一个项目并突出显示它后,第五个项目也突出显示,等等,当我向下滚动列表。

有什么build议么? 谢谢!

Solutions Collecting From Web of "如何突出显示在ListView中选定的项目?"

使用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

这是用于自定义列表活动或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); } 

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

要解决这个问题,可以:不要重复使用视图多行,或不要重复使用多行的Drawable(每次创build一个新的)

我知道这听起来是资源密集型的,但是除非你有更好的解决scheme,否则这是最简单的解决scheme。

//// @绘制/ 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 Item

  <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> 

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

用这个列表select器:

 <?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> 

select首选的高亮颜色