Cómo personalizar una lista dinámica Parte de Android Jetpack.
Puedes personalizar los objetos RecyclerView
para satisfacer tus necesidades específicas. Las clases estándar que se describen en Cómo crear listas dinámicas con RecyclerView proporcionan todas las funciones que la mayoría de los desarrolladores necesitan. En muchos casos, solo necesitas diseñar la vista para cada contenedor de vistas y escribir el código a fin de actualizar esas vistas con los datos adecuados. Sin embargo, si tu app tiene requisitos específicos, puedes modificar el comportamiento estándar de varias maneras.
En este documento, se describen algunas de las personalizaciones posibles.
Cómo modificar el diseño
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 pedirle al adaptador que reemplace el contenido de la vista con un elemento diferente del conjunto de datos. De esta manera, cuando se reciclan las vistas, se mejora el rendimiento, ya que se evita la creación de vistas innecesarias o las búsquedas costosas de findViewById()
. La biblioteca de compatibilidad de Android incluye tres administradores de diseño estándar, de los cuales ofrecen muchas opciones de personalización:
LinearLayoutManager
: Organiza los elementos en una lista unidimensional. El uso deRecyclerView
conLinearLayoutManager
proporciona funciones como un diseñoListView
.GridLayoutManager
: Organiza los elementos en una cuadrícula bidimensional, como los cuadrados de una tabla de ajedrez. El uso deRecyclerView
conGridLayoutManager
proporciona funciones como un diseñoGridView
.StaggeredGridLayoutManager
: Organiza 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 estos administradores de diseño no satisfacen tus necesidades, puedes crear uno propio extendiendo la clase abstracta RecyclerView.LayoutManager
.
Cómo agregar animaciones de elementos
Cada vez que cambia un elemento, RecyclerView
usa un animador para modificar su apariencia. Este animador es un objeto que extiende la clase abstracta RecyclerView.ItemAnimator
. De forma predeterminada, RecyclerView
usa DefaultItemAnimator
para proporcionar la animación. Si quieres proporcionar 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 de una lista de RecyclerView
con entrada táctil o del mouse. Esto te permite mantener el control sobre la presentación visual de un elemento seleccionado. También puedes mantener el control sobre las políticas que controlan el comportamiento de selección, como qué elementos son aptos para la selección y cuántos se pueden seleccionar.
Para agregar compatibilidad de selección a una instancia de RecyclerView
, sigue estos pasos:
- Determina el tipo de clave de selección que usarás y, luego, crea una
ItemKeyProvider
.Existen tres tipos clave que puedes usar para identificar los elementos seleccionados:
Parcelable
y sus subclases, comoUri
String
Long
Para obtener información detallada sobre los tipos de claves de selección, consulta
SelectionTracker.Builder
. - Implementa
ItemDetailsLookup
. - Actualiza los objetos del elemento
View
enRecyclerView
para reflejar si el usuario los selecciona o anula la selección.La biblioteca de selección no proporciona una decoración visual predeterminada de los elementos seleccionados. Proporciona este dato cuando implementes
onBindViewHolder()
. Te recomendamos el siguiente enfoque:- En
onBindViewHolder()
, llama asetActivated()
(no asetSelected()
) en el objetoView
contrue
ofalse
, según si se seleccionó el elemento. - Actualiza el estilo de la vista para representar el estado activado. Recomendamos usar un recurso de lista de estados con colores para configurar el estilo.
- En
- Usa
ActionMode
a fin de proporcionar al usuario las herramientas para realizar una acción en la selección. - Realizar cualquier acción secundaria interpretada
- 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 RecyclerView
a los que se les otorga un MotionEvent
.
En efecto, es una fábrica de instancias de ItemDetails
que están respaldadas por una instancia RecyclerView.ViewHolder
o que se extraen de ella.
Registra un SelectionTracker.SelectionObserver
para recibir una notificación cuando cambie una selección. Cuando se crea una selección por primera vez, inicia ActionMode
para presentársela al usuario y proporcionar acciones específicas de la selección. Por ejemplo, puedes agregar un botón de borrar 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 borra la selección la última vez), finaliza el modo de acción.
Al final de la canalización del procesamiento de eventos, la biblioteca podría determinar que el usuario intenta activar un elemento, si lo presiona, o que intenta arrastrar un elemento o un 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
.
En el siguiente ejemplo, se muestra cómo reunir todos estos elementos:
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 compilar una instancia de SelectionTracker
, tu app debe proporcionar el mismo RecyclerView.Adapter
que usas para inicializar RecyclerView
en SelectionTracker.Builder
. Por este motivo, después de crear la instancia de SelectionTracker
, inyéctala en tu 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 en 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 desde 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 obligatorio porque una actividad o un fragmento pueden tener más de una lista distinta para seleccionar, y todas deben conservarse en su estado guardado.
Recursos adicionales
Consulta las siguientes referencias para obtener más información.
- App de demostración de Sunflower, que usa
RecyclerView
. - Usa RecyclerView para mostrar una lista desplazable en el codelab.
- Aspectos básicos de Kotlin para Android: Conceptos básicos de RecyclerView