Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
Personaliza una lista dinámica
Parte de Android Jetpack
Prueba hacerlo con Compose
Jetpack Compose es el kit de herramientas de IU recomendado para Android. Obtén información para trabajar con diseños en Compose.
Puedes personalizar los objetos 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 necesitan. En muchos casos, solo necesitas diseñar la vista para cada contenedor de vistas y escribir el código para actualizarlas con los datos correspondientes. Sin embargo, si tu app tiene requisitos específicos, puedes modificar el comportamiento estándar de diferentes maneras.
En este documento, se describen algunas de las personalizaciones posibles.
Modifica 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 solicitar al adaptador que reemplace el contenido de la vista por un elemento diferente del conjunto de datos. Reciclar las vistas de esta manera mejora el rendimiento, ya que se evita que se creen vistas innecesarias o 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 un objeto RecyclerView
con LinearLayoutManager
ofrece funciones como un diseño de ListView
.
GridLayoutManager
:
Dispone los elementos en una cuadrícula bidimensional, como los cuadrados de un
tablero de ajedrez. Usar un objeto RecyclerView
con GridLayoutManager
ofrece funciones como un diseño de GridView
.
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 se adecuan a tus necesidades, puedes crear uno propio extendiendo la clase abstracta RecyclerView.LayoutManager
.
Agrega animaciones de elementos
Siempre que cambia un elemento, RecyclerView
usa un animador para cambiar su apariencia. Este animador es un objeto que extiende la clase abstracta RecyclerView.ItemAnimator
. De forma predeterminada, el objeto RecyclerView
usa DefaultItemAnimator
para proporcionar la animación. Si quieres proporcionar animaciones personalizadas, puedes definir tu propio objeto animador extendiendo RecyclerView.ItemAnimator
.
Habilita la selección de elementos de listas
La biblioteca de recyclerview-selection
permite a los usuarios seleccionar elementos en una lista de RecyclerView
con entrada táctil o del mouse. Esto te permite seguir 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 estos pasos:
- Determina el tipo de clave de selección que usarás y, luego, crea un objeto
ItemKeyProvider
.
Existen tres tipos de claves que puedes usar para identificar los elementos seleccionados:
Para obtener información detallada sobre los tipos de claves de selección, consulta SelectionTracker.Builder
.
- Implementa
ItemDetailsLookup
.
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 que se extraen de ella.
- Actualiza los objetos
View
del elemento en RecyclerView
para reflejar si el usuario los selecciona o anula su selección.
La biblioteca de selección no proporciona una decoración visual predeterminada de los
elementos seleccionados. Proporciona este valor cuando implementes onBindViewHolder()
.
Te recomendamos que sigas este enfoque:
- Usa
ActionMode
para proporcionar al usuario herramientas para realizar una acción en la selección.
Registra un objeto
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 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), finaliza el modo de acción.
- Realiza las acciones secundarias interpretadas.
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 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
.
- Reúne todo con
SelectionTracker.Builder
.
En el siguiente ejemplo, se muestra cómo reunir todo esto:
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 usas para inicializar RecyclerView
en SelectionTracker.Builder
. Por este motivo, después de crear la instancia de SelectionTracker
, insértala en tu RecyclerView.Adapter
. De lo contrario, no podrás verificar el estado seleccionado de un elemento con el método onBindViewHolder()
.
- Incluye la selección en los eventos del ciclo de vida de la actividad.
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 obligatorio porque una actividad o un fragmento pueden tener más de una lista distinta para seleccionar, y todas deben persistir en su estado guardado.
Recursos adicionales
Consulta las siguientes referencias para obtener más información.
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-08-27 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-08-27 (UTC)"],[],[],null,["# Customize a dynamic list\nPart of [Android Jetpack](/jetpack).\n=============================================================\n\nTry the Compose way \nJetpack Compose is the recommended UI toolkit for Android. Learn how to work with layouts in Compose. \n[Lazy Lists and Grids →](/jetpack/compose/lists#lazy) \n\nYou can customize\n[RecyclerView](/reference/androidx/recyclerview/widget/RecyclerView)\nobjects to meet your specific needs. The standard classes described in\n[Create dynamic lists with\nRecyclerView](/guide/topics/ui/layout/recyclerview) provide all the functionality that most developers need. In\nmany cases, you only need to design the view for each view holder and write the\ncode to update those views with the appropriate data. However, if your app has\nspecific requirements, you can modify the standard behavior in a number of ways.\nThis document describes some of the possible customizations.\n\nModify the layout\n-----------------\n\n`RecyclerView` uses a layout manager to position the individual\nitems on the screen and to determine when to reuse item views that are no longer\nvisible to the user. To reuse---or *recycle* ---a view, a layout\nmanager might ask the adapter to replace the contents of the view with a\ndifferent element from the dataset. Recycling views this way improves\nperformance by avoiding the creation of unnecessary views or performing\nexpensive\n[findViewById()](/reference/android/app/Activity#findViewById(int))\nlookups. The Android Support Library includes three standard layout managers,\nach of which offers many customization options:\n\n- [LinearLayoutManager](/reference/androidx/recyclerview/widget/LinearLayoutManager): arranges the items in a one-dimensional list. Using a `RecyclerView` with `LinearLayoutManager` provides functionality like a [ListView](/reference/android/widget/ListView) layout.\n- [GridLayoutManager](/reference/androidx/recyclerview/widget/GridLayoutManager): arranges the items in a two-dimensional grid, like the squares on a checkerboard. Using a `RecyclerView` with `GridLayoutManager` provides functionality like a [GridView](/reference/android/widget/GridView) layout.\n- [StaggeredGridLayoutManager](/reference/androidx/recyclerview/widget/StaggeredGridLayoutManager): arranges the items in a two-dimensional grid, with each column slightly offset from the one before, like the stars on an American flag.\n\nIf these layout managers don't suit your needs, you can create your own by\nextending the\n[RecyclerView.LayoutManager](/reference/androidx/recyclerview/widget/RecyclerView.LayoutManager)\nabstract class.\n\nAdd item animations\n-------------------\n\nWhenever an item changes, `RecyclerView` uses an *animator*\nto change its appearance. This animator is an object that extends the abstract\n[RecyclerView.ItemAnimator](/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator)\nclass. By default, the `RecyclerView` uses\n[DefaultItemAnimator](/reference/androidx/recyclerview/widget/DefaultItemAnimator)\nto provide the animation. If you want to provide custom animations, you can\ndefine your own animator object by extending\n`RecyclerView.ItemAnimator`.\n\nEnable list-item selection\n--------------------------\n\nThe\n[`recyclerview-selection`](/reference/androidx/recyclerview/selection/package-summary)\nlibrary lets users select items in a `RecyclerView` list using touch\nor mouse input. This lets you retain control over the visual presentation of a\nselected item. You can also retain control over policies controlling selection\nbehavior, such as which items are eligible for selection and how many items can\nbe selected.\n\nTo add selection support to a `RecyclerView` instance, follow\nthese steps:\n\n1. Determine which selection key type to use, then build an [`ItemKeyProvider`](/reference/androidx/recyclerview/selection/ItemKeyProvider).\n\n There are three key types you can use to identify selected items:\n - [Parcelable](/reference/android/os/Parcelable) and its subclasses, like [Uri](/reference/android/net/Uri)\n - [String](/reference/java/lang/String)\n - [Long](/reference/java/lang/Long)\n\n For detailed information about selection-key types, see\n [SelectionTracker.Builder](/reference/androidx/recyclerview/selection/SelectionTracker.Builder).\n2. Implement [ItemDetailsLookup](/reference/androidx/recyclerview/selection/ItemDetailsLookup).\n3. `ItemDetailsLookup` lets the selection library access information about `RecyclerView` items given a [MotionEvent](/reference/android/view/MotionEvent). It is effectively a factory for [`ItemDetails`](/reference/androidx/recyclerview/selection/ItemDetailsLookup.ItemDetails) instances that are backed up by, or extracted from, a [RecyclerView.ViewHolder](/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder) instance.\n4. Update item [View](/reference/android/view/View) objects in the `RecyclerView` to reflect whether the user selects or unselects them.\n\n The selection library doesn't provide a default visual decoration for the\n selected items. Provide this when you implement\n [onBindViewHolder()](/reference/androidx/recyclerview/widget/RecyclerView.Adapter#onBindViewHolder(VH, int)).\n We recommend the following approach:\n - In `onBindViewHolder()`, call [setActivated()](/reference/android/view/View#setActivated(boolean))---**not** [setSelected()](/reference/android/view/View#setSelected(boolean))---on the `View` object with `true` or `false`, depending on whether the item is selected.\n - Update the styling of the view to represent the activated status. We recommend using a [color state\n list resource](/guide/topics/resources/color-list-resource) to configure the styling.\n5. Use [ActionMode](/reference/androidx/appcompat/view/ActionMode) to provide the user with tools to perform an action on the selection.\n6. Register a [SelectionTracker.SelectionObserver](/reference/androidx/recyclerview/selection/SelectionTracker.SelectionObserver) to be notified when a selection changes. When a selection is first created, start `ActionMode` to present this to the user and provide selection-specific actions. For example, you can add a delete button to the `ActionMode` bar and connect the back arrow on the bar to clear the selection. When the selection becomes empty---if the user clears the selection the last time---terminate action mode.\n7. Perform any interpreted secondary actions.\n8. At the end of the event processing pipeline, the library might determine that the user is attempting to activate an item, by tapping it, or is attempting to drag an item or set of selected items. React to these interpretations by registering the appropriate listener. For more information, see [SelectionTracker.Builder](/reference/androidx/recyclerview/selection/SelectionTracker.Builder).\n9. Assemble everything with `SelectionTracker.Builder`.\n10. The following example shows how to put these pieces together: \n\n### Kotlin\n\n```kotlin\n var tracker = SelectionTracker.Builder(\n \"my-selection-id\",\n recyclerView,\n StableIdKeyProvider(recyclerView),\n MyDetailsLookup(recyclerView),\n StorageStrategy.createLongStorage())\n .withOnItemActivatedListener(myItemActivatedListener)\n .build()\n \n```\n\n### Java\n\n```java\n SelectionTracker tracker = new SelectionTracker.Builder\u003c\u003e(\n \"my-selection-id\",\n recyclerView,\n new StableIdKeyProvider(recyclerView),\n new MyDetailsLookup(recyclerView),\n StorageStrategy.createLongStorage())\n .withOnItemActivatedListener(myItemActivatedListener)\n .build();\n \n```\n11. To build a [SelectionTracker](/reference/androidx/recyclerview/selection/SelectionTracker) instance, your app must supply the same [RecyclerView.Adapter](/reference/androidx/recyclerview/widget/RecyclerView.Adapter) that you use to initialize `RecyclerView` to `SelectionTracker.Builder`. For this reason, after you create the `SelectionTracker` instance, inject it into your `RecyclerView.Adapter`. Otherwise, you can't check an item's selected status from the `onBindViewHolder()` method.\n12. Include selection in the [activity\n lifecycle](/guide/components/activities/activity-lifecycle) events.\n13. To preserve selection state across the activity lifecycle events, your app must call the selection tracker's [onSaveInstanceState()](/reference/androidx/recyclerview/selection/SelectionTracker#onSaveInstanceState(android.os.Bundle)) and [onRestoreInstanceState()](/reference/androidx/recyclerview/selection/SelectionTracker#onRestoreInstanceState(android.os.Bundle)) methods from the activity's [onSaveInstanceState()](/reference/android/app/Activity#onSaveInstanceState(android.os.Bundle)) and [onRestoreInstanceState()](/reference/android/app/Activity#onRestoreInstanceState(android.os.Bundle)) methods, respectively. Your app must also supply a unique selection ID to the `SelectionTracker.Builder` constructor. This ID is required because an activity or a fragment might have more than one distinct, selectable list, all of which need to be persisted in their saved state.\n\nAdditional resources\n--------------------\n\nSee the following references for additional information.\n\n- [Sunflower\n demo app](https://github.com/googlesamples/android-sunflower), which uses `RecyclerView`.\n- [Use\n RecyclerView to display a scrollable list](/codelabs/basic-android-kotlin-training-recyclerview-scrollable-list#0) codelab.\n- [Android\n Kotlin Fundamentals: RecyclerView fundamentals](/codelabs/kotlin-android-training-recyclerview-fundamentals) codelab."]]