Implementar Paging 3 con LazyColumn en Jetpack Compose
Carga listas grandes por páginas y muestra estados de carga, vacío y error.
Presentar una lista paginada sin descargar todos los registros en memoria.
Por qué es importante
Las listas largas pueden ralentizar el inicio, consumir datos y perder la posición al navegar. Paging 3 conecta una fuente de datos con una interfaz que solicita lotes cuando hacen falta. Puedes usar un PagingSource de red o base local y, si necesitas sincronización, evaluar RemoteMediator.
Requisitos
- Proyecto Kotlin con Compose y arquitectura básica ViewModel.
- Dependencias de Paging 3 y paging-compose compatibles con tu BOM y versiones actuales.
Trabaja en un proyecto de pruebas. Revisa las versiones y condiciones específicas de la documentación oficial, ya que las APIs y las políticas evolucionan.
Implementación
Define el contrato del repositorio: clave de página…
Define el contrato del repositorio: clave de página, cantidad de elementos y condición de final de lista.
Crea un PagingSource que devuelva Page y controle…
Crea un PagingSource que devuelva Page y controle errores de red o almacenamiento. Evita devolver siempre la misma clave.
Expón Pager.flow desde el repositorio y aplica cachedIn(viewModelScope)…
Expón Pager.flow desde el repositorio y aplica cachedIn(viewModelScope) en tu ViewModel cuando corresponda.
En Compose usa collectAsLazyPagingItems para obtener el listado…
En Compose usa collectAsLazyPagingItems para obtener el listado y muestra elementos con claves estables si es posible.
Gestiona loadState.refresh y append para mostrar un indicador…
Gestiona loadState.refresh y append para mostrar un indicador, reintento y estado vacío sin bloquear toda la pantalla.
Prueba scroll veloz, conexión intermitente, rotación y cambios…
Prueba scroll veloz, conexión intermitente, rotación y cambios de filtro. Define cuándo invalidar la fuente al cambiar la consulta.
Fragmento de referencia
@Composable
fun ListaPaginada(viewModel: ProductosViewModel) {
val items = viewModel.productos.collectAsLazyPagingItems()
LazyColumn {
items(count = items.itemCount) { indice ->
val producto = items[indice]
if (producto != null) Text(producto.nombre)
}
}
}
// Requiere tu modelo Producto y un ViewModel con Flow<PagingData<Producto>>.Ejemplo educativo: cuando se indique, añade las importaciones, dependencias, claves de prueba o clases de tu proyecto. No se presenta como proyecto Android completo y compilado.
Ponlo a prueba
Prepara 200 elementos falsos y verifica que la interfaz renderice progresivamente sin crear 200 vistas al inicio.
Lista de comprobación
- La implementación cumple el objetivo: presentar una lista paginada sin descargar todos los registros en memoria.
- El comportamiento se verificó con datos de prueba y se documentaron los casos de fallo.
- Los recursos, dependencias y políticas se comprobaron contra las referencias oficiales.
- No se registran datos sensibles ni se da por probada una mejora sin evidencia.
Errores habituales
- No reiniciar un Pager por cada recomposición.
- No ignorar estados de error de carga siguiente.
- No confundir cachedIn con persistencia de datos sin conexión.
¿Paging 3 reemplaza Room?
No. Paging administra el flujo de páginas y puede trabajar junto con Room como fuente local.
Referencias para ampliar
Consulta las versiones, limitaciones y requisitos vigentes antes de integrar los ejemplos en producción.