我阅读了很多关于 ListSelector 和选择器的内容。但我不知道如何让 ListView 的项目在按下后具有不同的颜色。
在双片段布局中,用户在左侧 ListView 中单击,数据被加载并显示在右侧片段中。为了让用户了解选择了哪个项目,我希望将其突出显示,直到左 ListView 中的下一个项目被按下。
我需要一个自定义状态吗?GMail 应用程序是如何做到这一点的?
谢谢
我阅读了很多关于 ListSelector 和选择器的内容。但我不知道如何让 ListView 的项目在按下后具有不同的颜色。
在双片段布局中,用户在左侧 ListView 中单击,数据被加载并显示在右侧片段中。为了让用户了解选择了哪个项目,我希望将其突出显示,直到左 ListView 中的下一个项目被按下。
我需要一个自定义状态吗?GMail 应用程序是如何做到这一点的?
谢谢
对,你需要额外的状态。我不确定 GMail 应用程序是如何做到的,但默认的 android 设置使用android:state_activated="true"
其选择器中的状态作为平板电脑上的列表。不要忘记设置列表android:choiceMode="singleChoice"
。
你试过这个选择器吗?
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_selected="true"
android:drawable="@android:color/transparent" />
<item android:state_selected="true"
android:drawable="@android:color/transparent" />
<item android:state_pressed="true" android:state_selected="false"
android:drawable="@android:color/transparent" />
<item android:state_selected="false"
android:drawable="@color/message_item_read" />
选择器必须应用于项目背景,而不是 listSelector。
我对 Android > 1.6 的解决方案是:
在活动中:
public static int POS = -1;
...
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
...
POS = arg2;
...
}
在适配器中:
public View getView(int position, View convertView, ViewGroup parent) {
...
int pos = MyActivity.POS;
if (pos == position){
convertView.setBackgroundResource(R.drawable.lv_yellow);
}else{
convertView.setBackgroundResource(R.drawable.lv_empty);
}
...
}
我自己也遇到了这个问题……在研究了很长时间之后,我找到了解决方案,它对我有用。首先在你的drawable文件夹下创建list_view_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Selector style for listrow -->
<item
android:state_selected="false"
android:drawable="@drawable/gradient_bg_listview" />
<item android:state_selected="true"
android:drawable="@drawable/gradient_bg_hover_listview" />
<item android:state_activated="true"
android:drawable="@drawable/gradient_bg_hover_listview" />
</selector>
然后是用于获取列表数据的布局,您必须定义 list_view_selector。就我而言,我这样定义:
//This is the adapter where I defined my customlistview
SimpleAdapter adapter1 = new SimpleAdapter(
this,
list1,
R.layout.customlistview,
new String[] {"practice_technique","blank"},
new int[] {R.id.text1,R.id.text2}
);
//This is my customlistview where I defined list_view_selector
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/list_view_selector" >
<TextView android:id="@+id/text1"
style="@style/ListViewItemTextStyle"
android:layout_width="fill_parent"
android:paddingTop="5dp"
android:paddingLeft="10dp"
android:layout_height="fill_parent"
/>
<TextView android:id="@+id/text2"
android:textSize="12sp"
android:textStyle="bold"
android:textColor="#616162"
android:paddingLeft="10dp"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</RelativeLayout>
然后最后 onListItemclick 你必须写这样的东西:
protected void onListItemClick(ListView l, View v, int position, long id)
{
super.onListItemClick(l, v, position, id);
HashMap<String, String> val = list.get(position);
selectedTech = val.get("practice_technique");
//below is the key line
v.setSelected(true);
startSelectedPage();
}
编写您自己的 ListAdapter 来执行此操作。具体来说,我会扩展 ArrayAdapter,并在此方法中放入一些代码:
View getView(int position, View convertView, ViewGroup parent)
本质上,此代码将检测该值是否已被单击,并更改视图的背景颜色。现在,你怎么知道以前点击过一个视图?我建议您进行ArrayAdapter
扩展OnClickListener
,并将 ListView 设置setOnItemClickListener
为自定义ArrayAdapter
。您可以通过以下方式确定单击了哪个项目:
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
//Note that position is the item which was clicked.
}