Personalización avanzada de RecyclerView Parte de Android Jetpack
Puedes personalizar los objetos de RecyclerView
para satisfacer tus necesidades específicas. Las clases estándar descritas en Cómo crear listas dinámicas con RecyclerView proporcionan toda la funcionalidad que la mayoría de los desarrolladores necesitarán. En muchos casos, la única personalización que necesitas es diseñar la vista para cada contenedor de vistas y escribir el código a los efectos de actualizar esas vistas con los datos correspondientes. No obstante, si tu app tiene requisitos específicos, puedes modificar el comportamiento estándar de diferentes maneras. En esta página, se describen algunas de las otras personalizaciones posibles.
Cómo modificar el diseño
El objeto RecyclerView
usa un administrador de diseño para posicionar los elementos individuales en la pantalla y determinar cuándo volver a usar las vistas de elementos que ya no ve el usuario. Para volver a usar (o reciclar) una vista, un administrador de diseño puede solicitar al adaptador que reemplace el contenido de la vista por un elemento diferente del conjunto de datos. Reciclar la vista de esta forma mejora el rendimiento, ya que evita que se creen vistas innecesarias o que se realicen búsquedas costosas de findViewById()
. La biblioteca de compatibilidad de Android incluye tres administradores de diseño estándar, cada uno de los cuales ofrece muchas opciones de personalización:
LinearLayoutManager
dispone los elementos en una lista unidimensional. Usar unaRecyclerView
conLinearLayoutManager
ofrece funciones como el diseño deListView
anterior.GridLayoutManager
dispone los elementos en una cuadrícula bidimensional, como los cuadrados de una tabla de ajedrez. Usar unaRecyclerView
conGridLayoutManager
ofrece funciones como el diseño deGridView
anterior.StaggeredGridLayoutManager
dispone los elementos en una cuadrícula bidimensional, en la que cada columna está ligeramente desplazada en función de la anterior, como las estrellas de la bandera estadounidense.
Si ninguno de estos administradores de diseño se adecua a tus necesidades, puedes crear el tuyo si extiendes la clase abstracta RecyclerView.LayoutManager
.
Cómo agregar animaciones de elementos
Siempre que cambia un elemento, el objeto RecyclerView
usa un animador para modificar su apariencia. Este animador es un objeto que extiende la clase abstracta RecyclerView.ItemAnimator
. De forma predeterminada, la RecyclerView
usa DefaultItemAnimator
para proporcionar la animación. Si quieres brindar animaciones personalizadas, puedes definir tu propio objeto animador extendiendo RecyclerView.ItemAnimator
.
Cómo habilitar la selección de elementos de listas
La biblioteca de recyclerview-selection
permite a los usuarios seleccionar elementos en la lista de RecyclerView
con entrada táctil o del mouse.
Tú sigues teniendo el control de la presentación visual de un elemento seleccionado. También puedes seguir controlando las políticas que rigen el comportamiento de selección, como los elementos que pueden seleccionarse y la cantidad de estos.
Para agregar compatibilidad de selección a una instancia de RecyclerView
, sigue los pasos que se describen a continuación:
- Determina el tipo de clave de selección que usarás y, luego, crea un
ItemKeyProvider
.Hay tres tipos de claves que puedes usar a fin de identificar elementos seleccionados:
Parcelable
(y todas las subclases comoUri
),String
yLong
. Para obtener información detallada sobre los tipos de claves de selección, consultaSelectionTracker.Builder
. - Implementa
ItemDetailsLookup
. - Actualiza las
Views
de los elementos deRecyclerView
para que refleje si el usuario realizó o no una selección.La biblioteca de selección no brinda una decoración visual predeterminada de los elementos seleccionados. Debes proporcionarla cuando implementes
onBindViewHolder()
. El enfoque recomendado es el siguiente:- En
onBindViewHolder()
, llama asetActivated()
(no asetSelected()
) en el objetoView
contrue
ofalse
(en función de si se selecciona el elemento). - Actualiza el estilo de la vista para representar el estado activado. Te recomendamos que uses un recurso de lista de estados con colores a fin de configurar el estilo.
- En
- Usa
ActionMode
a fin de ofrecer al usuario las herramientas para llevar a cabo una acción sobre la selección. - Cómo realizar acciones secundarias interpretadas
- Reúne todo con
SelectionTracker.Builder
- Incluye la selección en los eventos del ciclo de vida de la actividad.
ItemDetailsLookup
permite que la biblioteca de selección acceda a información sobre elementos de RecyclerView
a los que se otorga un MotionEvent
.
Se trata efectivamente de una fábrica de instancias de ItemDetails
que están respaldadas por una instancia de RecyclerView.ViewHolder
(o se extraen de ella).
Registra un objeto SelectionTracker.SelectionObserver
a los efectos de recibir una notificación sobre un cambio de selección. Cuando se crea una selección por primera vez, inicia ActionMode
para representar esto ante el usuario y proporciona acciones específicas de la selección. Por ejemplo, puedes agregar un botón de eliminación a la barra de ActionMode
y conectar la flecha hacia atrás de la barra para borrar la selección. Cuando se vacía la selección (si el usuario borró la selección la última vez), no olvides finalizar el modo de acción.
Al final de la canalización del procesamiento de eventos, la biblioteca puede determinar que el usuario intenta activar un elemento cuando lo presiona o que intenta arrastrar y soltar un elemento o conjunto de elementos seleccionados. Registra el objeto de escucha correspondiente como reacción a estas interpretaciones. Para obtener más información, consulta SelectionTracker.Builder
.
El ejemplo que se incluye a continuación muestra cómo reunir todo esto usando la clave de selección Long
:
Kotlin
var tracker = SelectionTracker.Builder( "my-selection-id", recyclerView, StableIdKeyProvider(recyclerView), MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build()
Java
SelectionTracker tracker = new SelectionTracker.Builder<>( "my-selection-id", recyclerView, new StableIdKeyProvider(recyclerView), new MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build();
Para crear una instancia de SelectionTracker
, tu app debe proporcionar el mismo objeto RecyclerView.Adapter
que usaste para inicializar RecyclerView
en SelectionTracker.Builder
.
Por este motivo, es probable que necesites inyectar la instancia de SelectionTracker
, una vez creada, en el objeto RecyclerView.Adapter
después de crear RecyclerView.Adapter
. De lo contrario, no podrás verificar el estado seleccionado de un elemento con el método onBindViewHolder()
.
Para preservar el estado de selección entre los eventos del ciclo de vida de la actividad, tu app debe llamar a los métodos onSaveInstanceState()
y onRestoreInstanceState()
del seguimiento de selección de los métodos onSaveInstanceState()
y onRestoreInstanceState()
de la actividad, respectivamente. Tu app también debe proporcionar un ID de selección único al constructor SelectionTracker.Builder
. Este ID es necesario porque una actividad o fragmento pueden tener más de una lista distinta para seleccionar, y todas deben tener un estado persistente guardado.
Recursos adicionales
RecyclerView
se utiliza en la app de demostración de Sunflower.