RecyclerView
es un componente View que facilita la visualización eficiente de grandes conjuntos de datos. En lugar de crear vistas para cada elemento del conjunto de datos, RecyclerView
mejora el rendimiento de tu app manteniendo un pequeño grupo de vistas y reciclándolas a medida que te desplazas por esos elementos.
En Compose, puedes usar listas diferidas para lograr lo mismo. En esta página, se describe cómo puedes migrar tu implementación de RecyclerView
para usar listas diferidas en Compose.
Pasos de la migración
Para migrar tu implementación de RecyclerView
a Compose, sigue estos pasos:
Comenta o quita el
RecyclerView
de la jerarquía de la IU y agrega unComposeView
para reemplazarlo si aún no hay ninguno en la jerarquía. Este es el contenedor de la lista Lazy que agregarás:<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- <androidx.recyclerview.widget.RecyclerView--> <!-- android:id="@+id/recycler_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent />"--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
Determina qué tipo de elemento componible de lista diferida necesitas según el administrador de diseño de tu
RecyclerView
(consulta la siguiente tabla). El elemento componible que selecciones será el elemento componible de nivel superior delComposeView
que agregaste en el paso anterior.LayoutManager
Componible
LinearLayoutManager
LazyColumn
oLazyRow
GridLayoutManager
LazyVerticalGrid
oLazyHorizontalGrid
StaggeredGridLayoutManager
LazyVerticalStaggeredGrid
oLazyHorizontalStaggeredGrid
// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
Crea un elemento componible correspondiente para cada tipo de vista en tu implementación de
RecyclerView.Adapter
. Por lo general, cada tipo de vista se asigna a una subclaseViewHolder
, aunque no siempre es así. Estos elementos componibles se usarán como representación de la IU para diferentes tipos de elementos de tu lista:@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
La lógica de los métodos
onCreateViewHolder()
yonBindViewHolder()
de tuRecyclerView.Adapter
se reemplazará por estos elementos componibles y el estado que les proporciones. En Compose, no hay separación entre crear un elemento componible y vincular datos en él; estos conceptos se combinan.Dentro de la ranura
content
de la lista diferida (el parámetro lambda al final), usa la funciónitems()
(o una sobrecarga equivalente) para iterar por los datos de tu lista. En la lambdaitemContent
, invoca el elemento componible apropiado para tus datos:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Casos de uso comunes
Decoraciones de artículos
RecyclerView
tiene el concepto de un ItemDecoration
, que puedes usar para agregar un dibujo especial para los elementos de la lista. Por ejemplo, puedes agregar un ItemDecoration
para agregar divisores entre los elementos:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
Compose no tiene un concepto equivalente de decoraciones de elementos. En su lugar, puedes agregar cualquier decoración de la IU en la lista directamente en la composición. Por ejemplo, para agregar divisores a la lista, puedes usar el elemento componible Divider
después de cada elemento:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
Animaciones de elementos
Se puede establecer un ItemAnimator
en un RecyclerView
para animar la apariencia de los elementos a medida que se realizan cambios en el adaptador. De forma predeterminada, RecyclerView
usa DefaultItemAnimator
, que proporciona animaciones básicas en los eventos de eliminación, adición y movimiento.
Las listas diferidas tienen un concepto similar a través del modificador animateItemPlacement
.
Consulta Animaciones de elementos para obtener más información.
Recursos adicionales
Para obtener más información sobre cómo migrar un RecyclerView
a Compose, consulta los siguientes recursos:
- Listas y cuadrículas: Documentación para implementar listas y cuadrículas en Compose.
- Interoperabilidad de Jetpack Compose: Cómo usar Compose en RecyclerView: Entrada de blog para usar Compose de manera eficiente en
RecyclerView
.
Recomendaciones para ti
- Nota: El texto del vínculo se muestra cuando JavaScript está desactivado
- Listas y cuadrículas
- Cómo migrar
CoordinatorLayout
a Compose - Otras consideraciones