2010-01-31 15 views
22

¿Cómo hago esto por elemento de lista seleccionado.Cambiar selección en un ListView de naranja a verde

He intentado añadir esto a android:background

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" 
     android:state_pressed="false" 
     android:drawable="@color/android_green" /> 
    <item android:state_focused="true" 
     android:state_pressed="true" 
     android:drawable="@color/black_alpha" /> 
    <item android:state_focused="false" 
     android:state_pressed="true" 
     android:drawable="@color/black_alpha" /> 
    <item android:drawable="@color/white_alpha" /> 
</selector> 

pero no funciona, cambia todo el ListView.


Todavía no funciona, esto es lo que tengo hasta ahora

:: listview_background

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" android:drawable="@color/black_alpha" /> 
    <item android:drawable="@color/white_alpha" /> 
</selector> 

:: Mi punto de vista que está utilizando el anterior

<ListView android:id="@+id/list" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:layout_below="@+id/round" 
    android:listSelector="@drawable/listview_background"> 
</ListView> 

El problema es que black_alpha aplicará la lista completa, no solo el elemento de lista seleccionado

+0

misma solución pero con la codificación de fuente completo se proporciona en este sitio [http://android-codes-examples.blogspot.com/2011/03/customized- listview-items-selection.html] (http://android-codes-examples.blogspot.com/2011/03/customized-listview-items-selection.html) Aquí se menciona claramente sobre dónde proporcionar el xml como fondo en la vista de lista, para que podamos grap fácil – Android

Respuesta

21

Aquí hay un good article sobre cómo usar selectores con listas.

En lugar de dejarlo a ser el android:background del ListView, creo que desea establecer android:listSelector como se muestra a continuación:

<ListView android:id="@+id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:divider="@null" 
     android:dividerHeight="0dip" 
     android:listSelector="@drawable/list_selector" /> 
+1

Creo que no está funcionando porque estoy usando un @color en lugar de @drawable – jax

+0

Esta es la solución "correcta". Los fondos android "estándar" se pueden encontrar en la carpeta android-sdk \ platforms \ android-14 \ data \ res \ drawable-mdpi search after list. – Warpzit

+0

¿Cómo funcionará para ListFragment? – Nishant

8

Jax, usted ha dicho que:

El problema es que black_alpha aplicará la lista completa, no solo la lista seleccionada elemento

Tuve el mismo problema. Después de jugar con él durante un tiempo, logré que dejara de aplicar el color a toda la lista usando una imagen png de 3x3 del color que quería en lugar de aplicar un color. Entonces, por alguna extraña razón, si usas un color obtienes un comportamiento de fondo extraño, cuando usas un png, funciona bien. : S

Así que esa es una forma de evitarlo.

----- ---------- Otra forma

he encontrado los mejores resultados cuando ponga el selector de vista de lista para no tener estados como esta:

res/dibujable/list_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
</selector> 

Entonces se encargan de todos los estados en el fondo del elemento de la lista. NO en el selector. Descubrí que tenía más control de esta manera.

res/color/list_item_bg.xml

<?xml version="1.0" encoding="utf-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_selected="false" 
    android:state_pressed="false" 
    android:drawable="@color/list_item_black_translucent" /> 
<item android:state_pressed="true" 
    android:drawable="@color/light_green_accent_translucent" /> 
</selector> 

Entonces aquí es mi elemento de la lista:

res/layout/simple_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:paddingRight="45dip" 
android:paddingBottom="2dip" 
android:layout_gravity="center_vertical" 
android:background="@color/list_item_bg"> 
    <ImageView 
    android:id="@+id/arrow" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="8dip" 
    android:src="@drawable/list_item_arrow" /> 
<TextView 
android:id="@+id/simple_list_item_label" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:gravity="center_vertical" 
android:textSize="12sp" 
android:textColor="@color/list_label_color"/> 
</LinearLayout> 
+0

Solo quiero agregar que su "otra forma" también funciona muy bien si los elementos de la lista tienen un margen, ya que la configuración de un listSelector en toda la lista parece ignorar los márgenes de los elementos. ¡Gracias por el consejo! – Gromix

+0

pero esto siempre dibujará el selector en el fondo, y eso no siempre es deseado. podría crear una superposición para todo el artículo, pero esa no es la mejor solución ... – Ixx

3

También estaba frente a su problema, donde el cambio de color se aplica a toda la lista.

Pero ahora su trabajo para mí ahora:

Mi página principal que contiene la vista de lista (se dio cuenta de que no se aplicaba la listselector aquí):

<ListView 
    android:id="@+id/controlList" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

aplicarse en lugar del listselector a getView, es como decir esa fila particular (convertView) para usar el listselector.xml en dibujable plegable cuando su estado cambia, por ejemplo presionado, centrado ...:

@Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder viewHolder; 
      if(convertView == null){ 
       LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
       convertView = li.inflate(R.layout.control_list, null); 
       viewHolder = new ViewHolder(); 

       viewHolder.topText = (TextView) convertView.findViewById(R.id.toptext); 
       viewHolder.bottomText = (TextView) convertView.findViewById(R.id.bottomtext); 
       convertView.setTag(viewHolder); 

      } 
      else{ 
       viewHolder = (ViewHolder) convertView.getTag(); 
      } 


        //each convertView will be assigned the listselector 
      convertView.setBackgroundResource(R.drawable.listselector); 


      viewHolder.topText.setText(testSchemes[position]); 

      //viewHolder.vText.setText(testDetails[position]); 
      return convertView; 
     } 

Y por último, mi listselector.xml:

<?xml version="1.0" encoding="utf-8"?> 

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="false" 
     android:state_selected="false" 
     android:drawable="@color/lightgreen" /> 

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. --> 
    <item android:state_pressed="true" 

     android:drawable="@color/darkgreen" /> 

    <item android:state_selected="true" android:state_pressed="false" 
     android:drawable="@color/orange" /> 



</selector> 

Esto es lo que hace el código anterior: Todas las entradas de la primera vez que se carga verde claro. Desplazarse hacia arriba y hacia abajo usando el cursor resalta la entrada seleccionada de color naranja. Al presionar una fila, se convierte en verde oscuro.

2

Como se menciona en un comentario, una solución de trabajo es usar una forma en lugar de un color (también estaba resaltando toda la lista). Aquí es una solución completa:

añadir estos 2 atributos a la vista de lista:

android:drawSelectorOnTop="true" 
android:listSelector="@drawable/my_list_selector" 

añadir a la carpeta my_list_selector.xml dibujable:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <solid android:color="#77526F35"/> 
</shape> 

Ahora los elementos de la lista debería mostrar una superposición verde semitransparente en estado presionado.

+0

Niza +1 esta fue la solución más simple para mí. Solucionado mi problema 2.3. Puede simplemente aplicar el selector en la vista de lista - happy times – Dori

0

Me enfrenté al mismo problema y luego solo necesitaba una línea simple en mi vista de elemento xml.

android:background="?android:attr/activatedBackgroundIndicator" 

Comprobar este post: This post podría ayudar

Cuestiones relacionadas