1

我阅读了很多关于 ListSelector 和选择器的内容。但我不知道如何让 ListView 的项目在按下具有不同的颜色。

在双片段布局中,用户在左侧 ListView 中单击,数据被加载并显示在右侧片段中。为了让用户了解选择了哪个项目,我希望将其突出显示,直到左 ListView 中的下一个项目被按下。

我需要一个自定义状态吗?GMail 应用程序是如何做到这一点的?

谢谢

4

5 回答 5

2

对,你需要额外的状态。我不确定 GMail 应用程序是如何做到的,但默认的 android 设置使用android:state_activated="true"其选择器中的状态作为平板电脑上的列表。不要忘记设置列表android:choiceMode="singleChoice"

于 2012-11-20T14:06:31.397 回答
2

你试过这个选择器吗?

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

于 2012-11-20T14:06:33.760 回答
2

我对 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);
}
...
}
于 2012-11-20T14:10:47.827 回答
1

我自己也遇到了这个问题……在研究了很长时间之后,我找到了解决方案,它对我有用。首先在你的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();
  }
于 2012-11-20T21:40:57.460 回答
0

编写您自己的 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. 
  }
于 2012-11-20T14:05:05.893 回答