按下项目后的ListSelector颜色

时间:2012-11-20 13:55:27

标签: android android-listview selection

我读了很多关于ListSelector和选择器的内容。但我无法弄清楚如何让ListView的项目具有不同的颜色被按下之后。

在双片段布局中,用户点击左侧列表视图,数据加载并显示在右侧片段中。为了让用户知道选择了哪个项目我想要突出显示,直到按下左侧ListView中的下一个项目。

我需要一个自定义国家吗? GMail应用程序如何做到这一点?

THX

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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。

答案 2 :(得分:2)

我的Android解决方案&gt; 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);
}
...
}

答案 3 :(得分: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();
  }

答案 4 :(得分: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. 
  }