Swipe to Delete al RecyclerView¶
1. Què és el Swipe to Delete?¶
És un patró d'interfície que permet a l'usuari eliminar un element de la llista fent lliscar el dit cap a l'esquerra o la dreta sobre la fila.
Android proporciona la classe ItemTouchHelper que detecta gestos de swipe (i drag) sobre un RecyclerView sense necessitat de biblioteques externes.
2. Com funciona?¶
El flux és el següent:
- Creem un
ItemTouchHelper.SimpleCallbackque detecta el gest de swipe. - Quan l'usuari fa swipe, es crida el mètode
onSwiped()amb la posició de la fila. - Dins
onSwiped(), demanem a l'adapter que elimini l'element d'aquella posició. - Connectem l'
ItemTouchHelperal RecyclerView.
3. Mètode per eliminar a l'Adapter¶
Cal afegir un mètode removeAt(position) a l'adapter que elimini l'element de la llista i notifiqui el canvi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
Explicació¶
- La llista
itemsha de serMutableListperquè es pugui modificar. removeAt(position)elimina l'element de la llista i cridanotifyItemRemoved(position)perquè el RecyclerView actualitzi la vista amb animació.
4. Configurar l'ItemTouchHelper a l'Activity¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | |
Explicació pas a pas¶
ItemTouchHelper.SimpleCallback(dragDirs, swipeDirs)
dragDirs = 0→ No activem el drag & drop (arrossegar per reordenar).swipeDirs = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT→ Detectem swipe cap a l'esquerra i cap a la dreta. Si només volem un sentit, posem nomésLEFToRIGHT.
onMove(...)
- Es crida quan es detecta un gest de drag & drop. Com que no el volem, retornem
false.
onSwiped(viewHolder, direction)
- Es crida quan l'usuari completa el gest de swipe.
viewHolder.adapterPositionens dóna la posició de la fila dins la llista.- Cridem
adapter.removeAt(position)per eliminar l'element.
attachToRecyclerView(recyclerView)
- Connecta l'
ItemTouchHelperal RecyclerView perquè comenci a detectar gestos.
5. Limitar la direcció del swipe¶
Si volem que només funcioni cap a l'esquerra (com és habitual en moltes apps):
// Canviar el segon paràmetre del SimpleCallback
ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT)
6. Resum¶
- Afegir un mètode
removeAt(position)a l'adapter que elimini de la llista i cridinotifyItemRemoved. - Crear un
ItemTouchHelper.SimpleCallbackambonSwiped()que cridiadapter.removeAt(). - Connectar l'
ItemTouchHelperal RecyclerView ambattachToRecyclerView().