Necesita ayuda con el selector de colores para los elementos de ListView seleccionados

Tengo un ListView con la disposición de encargo para sus artículos y necesito especificar el color de fondo separado para los artículos comprobados usando el selector. Aquí está el selector para los elementos impares:

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

Y aquí está el selector de los elementos pares:

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

La plantilla de elemento de ListView se ve así:

 <?xml version="1.0" encoding="utf-8"?> <com.androidhub.core.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="40dip"> <TextView android:text="TextView" android:id="@+id/textView1" android:layout_height="fill_parent" android:layout_width="wrap_content" android:gravity="center_vertical" android:textColor="@color/list_item"></TextView> </com.androidhub.core.CheckableLinearLayout> 

El elemento raíz del elemento de lista es CheckableLinearLayout: http://paste.org/pastebin/view/28711

ListView tiene modo de opción única (también he probado el modo de opción múltiple, pero también no funciona para mí)

 public class MainActivity extends ListActivity { List<String> items = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); items.add("test 1"); items.add("test 2"); items.add("test 3"); items.add("test 4"); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); getListView().setAdapter(new TestAdapter(this, items)); getListView().setBackgroundColor(getResources(). getColor(android.R.color.white)); } } 

En el adaptador para este ListView llamo el método setChecked () de CheckableLinearLayout pero no cambia su color:

 @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(getContext()); View v = convertView; if(v == null) { v = inflater.inflate(R.layout.list_item, null); } if(position % 2 != 0) { v.setBackgroundResource(R.drawable.list_item_even); } else { v.setBackgroundResource(R.drawable.list_item_odd); } if(parent instanceof ListView) { ListView lv = (ListView)parent; if(v instanceof CheckableLinearLayout) { CheckableLinearLayout cll = (CheckableLinearLayout)v; cll.setChecked(lv.isItemChecked(position)); } } return v; } 

¿Qué estoy haciendo mal? Puedo ver que el artículo state_pressed del selector trabaja muy bien pero state_checked no. ¿Cuál será el enfoque correcto para configurar el fondo state_checked desde XML, no desde el código?

Creo que estás buscando este atributo:

 android:duplicateParentState="true" 

Trate de añadirlo a su etiqueta CheckableLinearLayout en el diseño de la celda.

La pulsación / liberación de tecla es el único evento que se propaga a las vistas secundarias de un ViewGroup, por lo que cada vista administrará su propio estado a menos que explícitamente le diga que utilice sus padres.

También, después de este cambio pienso que usted puede apenas quitar el bloque entero del código que fuerza el CheckableLinearLayout para ser comprobado:

 if(parent instanceof ListView)... 

Intente implementar getListView (). SetOnItemClickListener como este:

 OnItemClickListener listener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckableLinearLayout r; for(int i = 0; i< lv.getChildCount(); i++) { r= (CheckableLinearLayout)lv.getChildAt(i); if(i==position) r.setChecked(true); else r.setChecked(false); } } }; 

¿Ha intentado crear un XML para mantener su ListView similar a esto? Hay algo de magia alrededor de la etiqueta @ + id / android: list.

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/megaphone_320x480"> <ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/megaphone_320x480" android:cacheColorHint="@drawable/transparent" /> <TextView android:id="@id/android:empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@drawable/red" android:gravity="center_vertical|center_horizontal" android:textStyle="bold" android:text="@string/error_no_groups" /> </LinearLayout> 
  • Weinre no puede abrir archivos .js
  • JavaCard 3 en el mundo real?
  • ¿Es posible obtener la máxima precisión GPS en el navegador móvil?
  • Soporte CSS3 en navegadores móviles
  • ¿Cómo se simula la memoria baja en el emulador de Android?
  • Forma correcta de llamar a super.onStop () al anular el registro de un oyente
  • Android: error de transferencia: sistema de archivos de sólo lectura
  • La aplicación de Android no aparece en la lista de aplicaciones recientes
  • Descargar Sin éxito en Mobile Browser (Android) al usar cfheader y cfcontent en Coldfusion
  • Selector de Google Drive (JavaScript) no móvil
  • Detectar la compatibilidad con la entrada de archivos del navegador
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.