Elemento seleccionado en listview personalizado con barra de acción contextual

Hace poco comencé a usar las barras de acción de android y las barras de acción contextual (CAB).

Sólo tengo una actividad que es una ListActivity. Básicamente uso el siguiente código cortado para "activar" el CAB:

ListView listView = getListView(); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { // Here you can do something when items are selected/de-selected, // such as update the title in the CAB } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { // Respond to clicks on the actions in the CAB switch (item.getItemId()) { case R.id.menu_delete: deleteSelectedItems(); mode.finish(); // Action picked, so close the CAB return true; default: return false; } } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate the menu for the CAB MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.context, menu); return true; } @Override public void onDestroyActionMode(ActionMode mode) { // Here you can make any necessary updates to the activity when // the CAB is removed. By default, selected items are deselected/unchecked. } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // Here you can perform updates to the CAB due to // an invalidate() request return false; } }); 

El diseño de la lista:

 <ImageView android:id="@+id/message_on_clipboard_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:minWidth="30dp" android:padding="7sp" android:src="@android:drawable/presence_online" > </ImageView> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/listitem_background" android:orientation="vertical" > <TextView android:id="@+id/message" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="5sp" android:fadingEdge="horizontal" android:singleLine="true" android:text="TextView" android:textAppearance="?android:attr/textAppearanceLarge" > </TextView> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/listitem_background" android:orientation="horizontal" > <TextView android:id="@+id/message_length" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5sp" android:text="@string/message_length" android:textAppearance="?android:attr/textAppearanceSmall" > </TextView> <TextView android:id="@+id/message_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5sp" android:text="TextView" android:textAppearance="?android:attr/textAppearanceSmall" > </TextView> <TextView android:id="@+id/date_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5sp" android:text="@string/date_label" > </TextView> <TextView android:id="@+id/date_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" > </TextView> </LinearLayout> </LinearLayout> 

Y dentro de main.xml:

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

Ahora si hago un largo clic en un elemento de lista el CAB aparece como se esperaba:

taxi

Utilizo un MultiChoiceModeListener pero desafortunadamente los artículos seleccionados de la lista no cambian el fondo como en el ejemplo aquí (fondo azul claro después de que se seleccione un artículo):

Introduzca aquí la descripción de la imagen

¿Tengo que usar un selector personalizado? ¿O hay un procedimiento estándar de cómo android se ocupa de esto y sólo tengo que hacer mi LinearLayouts transparente? También intenté lo siguiente, pero sin éxito:

ListView fondo del artículo a través de selector personalizado

Sería genial si alguien pudiera señalarme en la dirección correcta. Por favor, hágamelo saber si necesita más código de aplicación o archivos xml.

Sólo he probado esto en CHOICE_MODE_SINGLE, pero en esa situación funciona haciendo lo siguiente.

  • Cuando selecciona un elemento de lista, en código, llame al método "setItemChecked (position, checked)" (en la instancia de ListView) para ese elemento de la lista.

  • Agregue esto al XML para los elementos individuales de ListView:
    android:background="?android:attr/activatedBackgroundIndicator"

Basta con crear un drawable llamado custom_background en el camino:

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

Y establecer como fondo en su diseño padre:

 android:background="@drawable/custom_background" 

Sólo tratando de soportar dispositivos ICS y hasta, pero este nuevo diseño hace lo que está tratando de lograr, en mantener la línea seleccionada resaltada.

 adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_activated_1, null, from, to, 0); 

Para cualquier persona todavía resolver este problema, compruebe por favor su androide: minSdkVersion. Si es demasiado bajo, el color de fondo del selector puede no funcionar.

  • Ocultación de ActionBar en RecyclerView / ListView onScroll
  • Bucle para cargar las imágenes de la lista una por una
  • Android + ListFragment con una jerarquía de vista personalizada
  • SetShadowLayer provoca lento tiempo de dibujo en GridView?
  • Espaciado entre los elementos de listView Android
  • Eliminación de elementos de un ListView mediante un BaseAdapter personalizado
  • Cómo agregar un TextView dinámicamente en los elementos ListView Android?
  • ¿Cómo puedo actualizar información de una actividad de Android desde un servicio de fondo
  • La vista setVisibility (GONE) se vuelve invisible pero todavía ocupa espacio
  • Descargar varios archivos con una barra de progreso en ListView Android
  • Android menuitem valor de retorno del manejador de onclick
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.