Realizaremos una aplicación Android que permita editar y eliminar elementos en Realm. Utilizaremos para esto un menú colocado en el Action Bar de la app, así como un menú contextual relacionado con un ListView que muestra los elementos guardados en una base de datos Realm.
Vamos a crear un directorio de recursos para colocar allí nuestros menús.
Da clic derecho en res
Selecciona New->Android Resource Directory
En resource type elige menu, en directory name deja la opción: menu
Notaremos que se creó una carpeta llamada menu dentro de res
Da clic derecho sobre la carpeta menu (creada anteriormente)
Selecciona New->menu resource file
En File name escribe: menu_main_activity
El código de éste archivo será el siguiente:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/delete_all" android:title="Borrar todo" /> </menu>
Vamos a crear a continuación el menú contextual que aparecerá cuando demos una pulsación larga sobre un elemento del ListView.
Da clic derecho sobre la carpeta menu
Selecciona New->menu resource file
En File name escribe: context_menu_main_activity
El código de éste archivo será:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/edit_board" android:title="Editar" /> <item android:id="@+id/delete_board" android:title="Borrar" /> </menu>
Vamos ahora a MainActivity.java
(Consideramos que ya has realizado la parte previa de éste proyecto, que puedes consultar aquí)
En MainActivity vamos a escribir el código necesario para mostrar el menú que tiene la opción de Borrar todo.
Escribe el siguiente código:
@Override public boolean onCreateOptionsMenu(Menu menu){ getMenuInflater().inflate(R.menu.menu_main_activity,menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.delete_all: deleteAll(); return true; default: return super.onOptionsItemSelected(item); } }
Haremos lo mismo pero ahora con el menú contextual que tiene las opciones de Editar y Borrar.
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; menu.setHeaderTitle(boards.get(info.position).getTitle()); getMenuInflater().inflate(R.menu.context_menu_main_activity,menu); } @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()){ case R.id.delete_board: deleteBoard(boards.get(info.position)); return true; case R.id.edit_board: showAlertForEditingboard("Editar tablero", "Cambia el nombre del tablero", boards.get(info.position)); return true; default: return super.onContextItemSelected(item); } }
Como puedes observar los menús que hemos creado invocan las siguientes operaciones: Borrar todo, Borrar un elemento y Editar un elemento.
Vamos a crear los métodos que realizan éstas acciones.
Agrega los siguientes métodos a nuestro código de MainActivity
private void deleteAll() { realm.beginTransaction(); realm.deleteAll(); realm.commitTransaction(); } private void deleteBoard(Board board) { realm.beginTransaction(); board.deleteFromRealm(); realm.commitTransaction(); }
Para el proceso de editar un registro, primero creamos un método que abra un cuadro de diálogo donde el usuario puede editar el nombre de un “tablero”. Si el nuevo nombre cumple los requisitos, se invoca la instrucción para editar elementos en Realm.
public void showAlertForEditingboard(String title, String message, final Board board){ AlertDialog.Builder builder = new AlertDialog.Builder(this); if (title != null) builder.setTitle(title); if (message != null) builder.setMessage(message); View viewInflated = LayoutInflater.from(this).inflate(R.layout.dialog_create_board, null); builder.setView(viewInflated); final EditText input = (EditText) viewInflated.findViewById(R.id.editTextNewBoard); input.setText(board.getTitle()); builder.setPositiveButton("Guardar", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { String boardName = input.getText().toString().trim(); if (boardName.length()== 0) Toast.makeText(getApplicationContext(), "Debe escribir un nombre", Toast.LENGTH_LONG).show(); else if (boardName.equals(board.getTitle())){ Toast.makeText(getApplicationContext(), "El nombre es el mismo", Toast.LENGTH_LONG).show(); } else{ editBoard(boardName, board); } } }); AlertDialog dialog = builder.create(); dialog.show(); }
Agregamos además el siguiente método:
private void editBoard(String newName, Board board) { realm.beginTransaction(); board.setTitle(newName); realm.copyToRealmOrUpdate(board); realm.commitTransaction(); }
Ya solo nos queda registrar el menu contextual para que sea utilizado por el ListView, por lo que agregamos la siguiente línea a nuestro método onCreate:
registerForContextMenu(listview);
La apariencia de los menús es similar a lo que vemos a continuación:
Si deseas ver el resultado final, da clic aquí.