ListView Item Selected Estado no funciona

Así que tengo un ListView y quiero cambiar el color de cada fondo y texto de los elementos. Este ListView está dentro de un ListFragment. Mi código infla el diseño en el onCreateView e infla el diseño de cada elemento en el newView .

El android:state_pressed="true" está funcionando bien, cuando android:state_pressed="true" en un elemento el fondo cambia a ese color. Pero al seleccionar un elemento, ni el color bg ni el color del texto cambian, aunque he definido un elemento con android:state_selected="true" en el selector.

Edit: Estoy usando SDK nivel 11 (Android 3.0) y un Motorola Xoom.

El diseño del fragmento de la lista:

 <?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="fill_parent" android:orientation="vertical"> <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent"/> </LinearLayout> 

El diseño del elemento de lista:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="25dp" android:background="@drawable/list_item_bg_selector"> <TextView android:id="@+id/form_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="@dimen/text_size_xlarge" android:textStyle="bold" android:textColor="@drawable/list_item_text_selector" /> <TextView android:id="@+id/form_subtitle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="@dimen/text_size_medium" android:textStyle="normal" android:layout_marginTop="5dp" android:textColor="@drawable/list_item_text_selector" /> </LinearLayout> 

El selector de fondo:

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

El selector de texto:

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

La respuesta es usar el estado android:state_activated="true" , en lugar del estado "selected". Más información aquí: ListFragment Item Selected Background

La mejor solución con soporte de todos los niveles de API es implementar la característica Verificable para el elemento de lista View que significa que la vista superior de la disposición del elemento de lista tiene que implementar la interfaz Checkable (en mi caso fue TextView, pero puede aplicarse a ViewGroup Clases como LinearLayout ). Cuando hace clic en un elemento de lista, el método setChecked llamada ListView y allí cambiamos el estado de View para usar android:state_checked="true" selector. Junto con la vista de lista android:choiceMode="singleChoice" seleccionará sólo un elemento.

El truco consiste en anular el método onCreateDrawableState y establecer el estado marcado aquí para drawables. Vea el ejemplo de SelectableTextView abajo. Después de que se llama a setChecked , el estado marcado se almacena y se llama refreshDrawableState .

Ejemplo de SelectableTextView :

 package com.example.widget.SelectableTextView; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.util.AttributeSet; import android.widget.Checkable; import android.widget.TextView; public class SelectableTextView extends TextView implements Checkable { private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked }; private boolean mChecked; public SelectableTextView(Context context) { super(context); } public SelectableTextView(Context context, AttributeSet attrs) { super(context, attrs); } public SelectableTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public SelectableTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); } } @Override public boolean isChecked() { return mChecked; } @Override public void toggle() { setSelected(!mChecked); } @Override protected int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) { mergeDrawableStates(drawableState, CHECKED_STATE_SET); } return drawableState; } } 

Ejemplo de diseño selectable_list_item.xml :

 <?xml version="1.0" encoding="utf-8"?> <com.example.widget.SelectableTextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="match_parent" android:textColor="@color/list_item_selector_foreground" android:background="@drawable/list_item_selector_background" tools:text="Item 1"/> 

Ejemplo de list_item_selector_foreground.xml :

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- checked --> <item android:color="@color/list_item_text_active" android:state_checked="true"/> <item android:color="@color/list_item_text"/> </selector> 

Ejemplo de list_item_selector_background.xml :

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/list_item_background_selected" android:state_pressed="true"/> <item android:drawable="@color/list_item_background_selected" android:state_focused="true"/> <item android:drawable="@color/list_item_background_active" android:state_checked="true"/> <item android:drawable="@color/list_item_background"/> </selector> 

No olvide establecer clickable="true" para el diseño. Esto solucionó mi problema.

Lista del diseño del elemento:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/list_item_bg_selector" android:clickable="true" > <TextView android:id="@+id/tvNewsPreviewTitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="3" android:ellipsize="end" android:textSize="@dimen/news_preview_title_textsize" android:textStyle="bold" /> </RelativeLayout> 

Selector de fondo:

  <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/black" /> <gradient android:startColor="@color/white" android:endColor="@color/white" /> </shape> </item> <item> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/holo_gray_darker" /> <gradient android:startColor="@color/holo_gray_bright" android:endColor="@color/holo_gray_bright" /> </shape> </item> </selector> 

@Andrew S: Junto con el uso del estado activado en el selector, el estado activado debe establecerse en falso para el caso por defecto como se muestra en el código del selector inferior.

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false" android:state_activated="false" android:color="@color/dark_text_blue"/> <item android:state_pressed="true" android:color="@color/red"/> <item android:state_activated="true" android:color="@color/red"/> </selector> 
  • ListView y elementos con temporizador de cuenta regresiva
  • OnListItemClick no funciona para listview?
  • ¿Cómo puedo crear un ListView con divisiones de línea punteadas / punteadas en Android?
  • Android - EditTexts dentro de ListView vinculado a Custom ArrayAdapter - manteniendo un registro de los cambios
  • Resalte el efecto mientras presiona el elemento en el adaptador ListView personalizado
  • Cargador de imágenes asíncronas en listview
  • Ocultar y mostrar el botón flotante mientras que los rollos de ListView
  • Cómo administrar deshacer después de deslizar para eliminar en android ListView?
  • Actualizar Android listview after scrollBy on
  • ¿Vista de lista con título, imagen y texto?
  • Cómo sincronizar dos posiciones de ListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.