我知道android在TouchMode下不会突出显示任何内容。但我正在做类似于 gmail 应用程序的事情,您可以从左侧选择内容并在活动的右侧显示详细信息(想知道 Google 是如何做到这一点的)。
所以故事是我必须突出显示左侧 ListView 上选择的内容。我发现了一些类似的问题,解决方案基本上是:
1.覆盖适配器的getView方法和选定位置的setBackground方法
2.在ItemClick上设置视图的背景并清除它以进行其他选择
但由于一种奇怪的行为,它们都不适合我:当我单击一个项目并突出显示它时,它后面的第五个项目也会突出显示,依此类推,当我向下滚动列表时。
有什么建议吗?谢谢!
使用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)
请参考下面的示例
这适用于自定义列表活动或 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/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>
突出显示多个项目的原因可能是因为您:重用整个视图,或者将这两个视图的背景设置为同一个 Drawable 实例。如果屏幕上有相同的可绘制对象两次,则第一个发生的所有事件都会发生在所有其他事件上,因为该逻辑是在可绘制对象本身的实例中实现的。
要解决这个问题,要么:不要为多行重复使用 View,或者不要为多行重复使用 Drawable(每次创建一个新的)
我知道这听起来需要大量资源,而且确实如此,但除非您有更好的解决方案,否则这是最简单的解决方案。
因为列表视图中的项目模仿顶部的项目,所以它们也模仿它们的背景。您必须在 getView() 函数中设置项目的每一个背景。在 getView() 中的每个项目中,您必须为选定的项目和未选定的项目设置背景。
使用它作为列表选择器:
<?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>
选择首选的突出显示颜色
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 即可工作。