RecyclerView
es un componente de vista que facilita mostrar de manera eficiente.
en grandes conjuntos de datos. En lugar de crear vistas para cada elemento del conjunto de datos,
RecyclerView
mejora el rendimiento de tu app, ya que mantiene un grupo pequeño de
y reciclarlas a medida que te desplazas por esos elementos.
En Compose, puedes usar listas diferidas para lograr lo mismo. 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:
Marca como comentario o quita el elemento
RecyclerView
de la jerarquía de tu IU y agrega un elementoComposeView
para reemplazarlo si aún no hay ninguno presente en la jerarquía. Esta es el contenedor de la lista diferida 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 lista diferida componible necesitas según tu Administrador de diseño de
RecyclerView
(consulta la tabla que aparece más abajo) El elemento componible que seleccionas 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
. Cada tipo de vista generalmente se asigna a unViewHolder
, aunque no siempre será así. Estos de elementos componibles se usarán como representación de la IU para diferentes tipos de elementos en 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 tu
onCreateViewHolder()
deRecyclerView.Adapter
y Se reemplazarán los métodosonBindViewHolder()
por estos elementos componibles y el estado que les proporcionas. En Compose, no hay separación entre crear un elemento componible para un elemento y vincular datos a él, estos conceptos son se combinan.Dentro del espacio
content
de la lista diferida (el parámetro lambda final), usa la funciónitems()
(o una sobrecarga equivalente) para iterar a través del datos para tu lista. En la lambdaitemContent
, invoca el elemento elemento componible para tus datos:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Casos de uso comunes
Decoración de artículos
RecyclerView
tiene el concepto de ItemDecoration
, que puedes usar para agregar un
dibujo especial para los elementos de la lista. Por ejemplo, puedes agregar
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 cambio,
puedes agregar cualquier decoración de IU en la lista directamente en la composición. Por ejemplo:
Para agregar divisores a la lista, puedes usar el elemento Divider
componible después de cada
elemento:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { Divider() } } }
Animaciones de elementos
Se puede configurar un ItemAnimator
en un RecyclerView
para animar la apariencia de
elementos a medida que se realizan cambios en el adaptador. De forma predeterminada, RecyclerView
usa
DefaultItemAnimator
, que proporciona animaciones básicas para quitar, agregar y
mover eventos.
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
Si quieres obtener más información para migrar un objeto RecyclerView
a Compose, consulta el siguiente vínculo:
los siguientes recursos:
- Listas y cuadrículas: documentación sobre cómo implementar listas y cuadrículas en Compose
- Interoperabilidad de Jetpack Compose: cómo usar Compose en una RecyclerView:
Entrada de blog para usar Compose de manera eficiente en un
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