Realizaremos un ContextMenu en Android (un menú contextual) que aparece al hacer una pulsación larga y que elimina elementos de un ListView
Deseamos hacer aparecer un menú contextual cuando se haga una pulsación larga sobre un elemento de un ListView.
Consulta los otros artículos relacionados:
Uso de un ListView en Android para mostrar una lista de datos
Optimizar un ListView usando ViewHolder
Crear un botón OptionsMenu para la action bar en Android
Paso 1. Crear el XML con las opciones que contendrá el menú.
Ir a carpeta de menu y dar New-> New Resource File
Como nombre asignamos context_menu
En la vista XML escribimos el siguiente código:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/delete_item" android:title="Borrar" /> </menu>
En este caso, nuestro ContextMenu solo tendrá una opción, aunque podríamos añadir más si fuese necesario.
Paso 2. Crear el ContextMenu
Sobreescribiremos el método onCreateContextMenu
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; menu.setHeaderTitle(this.names.get(info.position)); inflater.inflate(R.menu.context_menu, menu); }
En éste método se extrae información del menú (AdapterContextMenuInfo) para saber la posición del arreglo del elemento sobre el que se hizo una selección larga (info.position). Usando este dato, se consigue el nombre del elemento (names.get) y se utiliza como título del menú (menu.setHeaderTitle).
Éste método crea el menú contextual.
Paso 3. Manejar los eventos clic del menu
Sobreescribiremos el método onContextItemSelected
@Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()){ case R.id.delete_item: this.names.remove(info.position); this.myAdapter.notifyDataSetChanged(); return true; default: return super.onContextItemSelected(item); } }
En éste método extraemos también información del menú (AdapterContextMenuInfo) y utilizamos un switch considerando que el menú contextual puede tener varias opciones.
En caso de que la opción elegida sea delete_item se removerá el elemento del arreglo (names.remove) usando la posición obtenida (info.position). Entonces, se notifican los cambios realizados al adapter (myAdapter.notifyDataSetChanged).
Paso 4. Registrar el contextMenu del ListView
Se debe “registrar” el ContextMenu , por lo que se añadirá la siguiente línea al método onCreate.
registerForContextMenu(listview);
Si deseas puedes ver el resultado aquí.