突出显示ListView选定的行
我有一个相册列表(几百)。 当我触摸选定的专辑时,我想为用户提供播放整个专辑的select,或者移动到其曲目ListView。 没问题。 但是,在触摸albumListView中的特效之后,我希望该行保持高亮显示,以便用户知道点击了哪个项目,然后可以移动到OK或PLAY。 我如何在ListView中突出显示一行?
引自http://android-developers.blogspot.de/2008/12/touch-mode.html
想象一个简单的应用程序,例如ApiDemos,它显示了一个文本项目列表。 用户可以使用轨迹球在列表中自由导航,而且可以使用触摸屏来滚动和拖动列表。 这种情况下的问题是如何在用户通过触摸屏操纵列表时正确处理select。
在这种情况下,如果用户select列表顶部的项目,然后将列表向底部移动,则select会发生什么情况? 它应该保持在项目上,并滚动屏幕? 如果用户决定用轨迹球移动选区,会发生什么? 或者更糟糕的是,如果用户按下轨迹球作用于当前select的项目(屏幕上不再显示),会发生什么?
仔细考虑后,我们决定完全删除select,当用户通过触摸屏操纵UI。
在触摸模式下,没有焦点,也没有select。 一旦用户进入触摸模式,网格列表中的任何选定项目都将被取消select。 类似地,当用户进入触摸模式时,任何关注的小部件变得不重点。 下图说明了在用轨迹球select项目后用户触摸列表时发生的情况。
其他解决scheme(主要是XML)
1)将ListView
的choiceMode
设置为singleChoice
<ListView android:choiceMode="singleChoice" .../>
2)列表中的项目必须是可检视图,并使用颜色状态列表作为背景
例如:album_item.xml
<?xml version="1.0" encoding="utf-8"?> <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" android:background="@drawable/list_selector" .../>
3)背景颜色状态( list_selector.xml
)定义了高亮颜色
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/green" android:state_checked="true"/> <item android:drawable="@color/green" android:state_pressed="true"/> </selector>
Maaalte是正确的,在触摸模式下,由于在触摸模式下没有当前项目,因此不会在当前项目上显示焦点高亮。 有状态的select就像你描述的那样,当你和UI的其他部分进行交互时,这种select仍然是另一回事。
您可以使用CHOICE_MODE_SINGLE在列表中表示有状态的select。 它会将select视为检查状态。 只要您的适配器返回的视图实现了Checkable接口,您可以显示选定的状态,但您select。 (在项目视图或其他地方设置背景,实际上并不需要显示checkbox小部件。)然后,您可以使用ListView的项目检查方法来操纵或确定select。
我通过扩展ListView和重写getView()方法解决了这个问题。 我为“选定”状态保留了一个内部标识符,并根据它改变了项目的背景,如下所示:
@Override public View getView(int position, View convertView, ViewGroup parent) { View currView = super.getView(position, convertView, parent); StateListItem currItem = getItem(position); if (currItem.isItemSelected) { currView.setBackgroundColor(Color.RED); } else { currView.setBackgroundColor(Color.BLACK); } return currView; }
我的博客文章中有一个示例程序: http : //udinic.wordpress.com/2011/07/01/selectablelistview-make-selection-work/
这里是我的解决schemeListview:
<ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:divider="@android:color/darker_gray" android:dividerHeight="1dp" android:paddingLeft="10dip" android:paddingRight="10dip" android:choiceMode="singleChoice" android:paddingTop="8dip" > </ListView>
为list_row写一个select器
<!-- <item android:drawable="@color/android:transparent" android:state_selected="true" /> --> <item android:drawable="@android:color/darker_gray" android:state_selected="true"/> <item android:drawable="@android:color/darker_gray" android:state_activated="true"/> <item android:drawable="@android:color/darker_gray" android:state_pressed="true"/> <item android:drawable="@color/android:transparent"/>
确保你的item有state_activated = true
然后添加这个select器作为你的list_row背景
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/listitem_selector" android:orientation="vertical" > <TextView android:id="@+id/itemName" android:layout_width="match_parent" android:layout_height="match_parent" />
添加android:background="?activatedBackgroundIndicator
列出项目的主要布局类似于android.R.layout.simple_list_item_activated_2.xml
用单选模式实现你的列表: android:choiceMode=singleChoice
就像默认的android.R.layout.simple_list_item_single_choice
使用RadioButton
来表示所选的选项一样,您可以在列表项目布局中实现自定义突出显示状态或类似的function,以响应select更改。 诸如getCheckedItemPosition()
方法可以被应用程序用来确定用户当前select了哪个项目(如果需要的话)。
希望帮助!
我知道自从这个问题上次发生以来已经过了两年了,但以防别人将来需要它。 这是我的ListView的XML代码
<ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/results" android:choiceMode="singleChoice" android:listSelector="#ffdb700b"/>
你想改变android:listSelector
值。
以下解决scheme可用于突出显示一个或多个列表项目。 起点:有一个ListFragment通过ArrayAdapter实现来显示MyEntity列表。 如果select了项目,则作为项目布局一部分的TextView的颜色必须变为灰色。 多个项目应该是可选的。
-
ListFragment必须提供将在onListItemClicked()中调用的OnItemSelectListener(YourEntity项)。
public void onListItemClick(ListView l, View v, int position, long id) { MyEntity entity = (MyEntity) getListView().getItemAtPosition(position); if (entityListSelectListener != null) itemSelectListener.onItemSelect(entity); }
-
ArrayAdapter拥有所选项目的关键字段列表,并提供pipe理器方法addSelection(MyEntity)和clearAllSelections()。 重写方法getView()读取关键字段列表,如果实际位置在那里,则将特定的TextView颜色更改为灰色,否则将更改为透明。
public View getView(int position, View convertView, ViewGroup parent) { ... if (selectedEntityList.contains(entity.key)) //... highlight view field }
-
在拥有活动的onCreate()中,必须实现监听器来pipe理ArrayAdapter:调用addSelection()和notifyDataSetChanged()。
entityListFragment.setEntityListSelectListener( new EntityListFragment.OnItemSelectedListener() { public void onItemSelect(MyEntity entity) { aa.addSelection(entity); aa.notifyDataSetChanged(); }});
我有同样的问题,我通过在ListView代码中粘贴下面的代码来解决它
android:choiceMode="singleChoice" android:listSelector="#003366"
该xml文件如下所示
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/file_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:choiceMode="singleChoice" android:listSelector="#003366"/> <Button android:id="@+id/select" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="SELECT" android:layout_below="@id/file_list"/> </RelativeLayout>
在我的情况下,当使用simple_list_item_2时,唯一的解决scheme是重写适配器的getView()方法,并手动更改背景颜色:
listview = new SimpleAdapter(ctx, data, android.R.layout.simple_list_item_2, res, new String[] {"field1", "field2" }, new int[] {android.R.id.text1, android.R.id.text2 }) @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); if (this_is_the_selected_item) { view.setBackgroundColor(0xff999999); } else { view.setBackgroundColor(Color.BLACK); } return view; } };
记住每当你改变select的项目时调用listview.invalidateViews()。
这是我做的:) – 在主要的头撞墙之后。
对于适配器:
radioAdapter = new RadioAdapter(context, R.layout.row_layout, yourData);
对于row_layout.xml:
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/radio_name" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center_vertical" android:padding="10dp" android:background="?android:attr/activatedBackgroundIndicator" android:clickable="true" android:text="SOME RADIO" android:textColor="@color/Gray" android:textSize="25dp" />
要设置一个默认的位置来突出显示,只需要这样做到你的listView对象:
radioTitleList.setItemChecked(defaultPosition,true);
如果你想在点击列表时突出显示:
在您的自定义列表适配器中的getView()添加此之前返回视图:
row.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { radioTitleList.setItemChecked(position, true); // other stuff like navigating to a new activity etc } });