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:
- Manera fácil de agregar imágenes a un ListView de Android
- Pulse ListView cuando aparezca el teclado sin ajustarPan
- Detenga ViewPagers dentro de ListView de restablecer
- ExpandableListView con groupView fijo mientras se desplaza
- Cómo hacer Barra de desplazamiento movible y movible en una vista de lista
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:
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):
¿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.
- Agregar elementos a ListView, mantener la posición de desplazamiento y NO ver un salto de desplazamiento
- Detectar si TextView en ListView está ellipsizado
- Anulación de Android ListView onItemClick haciendo que el elemento se seleccione (marcado)
- El divisor de Android ExpandableListView es invisible
- Adaptador de matriz de Android con ArrayList y ListView no se actualizan cuando se cambia el arraylist
- Lista de paginación y CursorLoader
- Múltiples vistas de lista en un diseño de Android
- Listview error: "Su contenido debe tener un ListView cuyo atributo id es 'android.R.id.list'"
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.
- Uso de VideoView para streaming o video de descarga progresiva
- Error de compilación de Gradle después de actualizar a 3.0