0Pricing
Android Academy · Lección

Paging en listas de Compose

Renderice datos paginados con LazyColumn

Paging en listas de Compose es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Android Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Android Academy incluye 4 lecciones en total.

Mostrar datos paginados en Compose

La capa de datos le proporciona un Flow<PagingData<Article>>. La biblioteca paging-compose convierte ese flujo en algo que un LazyColumn puede mostrar, incluida la carga bajo demanda mientras el usuario se desplaza.

El puente principal es collectAsLazyPagingItems().

collectAsLazyPagingItems

Llame a collectAsLazyPagingItems() en el flujo dentro de un composable. Devuelve un objeto LazyPagingItems que realiza el seguimiento de los elementos cargados y de los estados de carga, y recompone la interfaz de usuario a medida que llegan las páginas.

import androidx.paging.compose.collectAsLazyPagingItems

@Composable
fun ArticleScreen(viewModel: ArticleViewModel) {
    val articles = viewModel.articles.collectAsLazyPagingItems()
    ArticleList(articles)
}

items() con LazyPagingItems

Dentro de un LazyColumn, utilice la sobrecarga de Paging de items(). Esta lee de LazyPagingItems y activa la carga de la siguiente página cuando el usuario se acerca al final.

Cada elemento puede ser null cuando los espacios reservados están habilitados, así que gestione ese caso.

import androidx.compose.foundation.lazy.LazyColumn
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.items

@Composable
fun ArticleList(articles: LazyPagingItems<Article>) {
    LazyColumn {
        items(articles) { article ->
            if (article != null) {
                ArticleRow(article)
            }
        }
    }
}

Claves estables para los elementos

Asigne a cada fila una clave estable para que Compose pueda realizar un seguimiento eficaz de los elementos durante la carga de páginas y evitar recomposiciones innecesarias.

Utilice la función auxiliar de Paging itemKey con una propiedad única y estable, como el identificador del elemento.

import androidx.paging.compose.itemKey

LazyColumn {
    items(
        count = articles.itemCount,
        key = articles.itemKey { it.id }
    ) { index ->
        val article = articles[index]
        if (article != null) ArticleRow(article)
    }
}

Leer los estados de carga

LazyPagingItems.loadState expone el estado actual de carga y error para tres operaciones:

  • refresh - la carga inicial o la carga iniciada al deslizar para actualizar
  • append - cargar la página siguiente (desplazarse hacia abajo)
  • prepend - cargar la página anterior (desplazarse hacia arriba)
import androidx.paging.LoadState

val refresh = articles.loadState.refresh
val append = articles.loadState.append

val isInitialLoading = refresh is LoadState.Loading
val isLoadingMore = append is LoadState.Loading

Estados de carga y vacío a pantalla completa

Utilice el estado refresh para controlar la primera impresión: un indicador de carga centrado mientras se cargan los datos, una vista de error si falla la operación o un mensaje de lista vacía cuando no haya nada que mostrar.

when (val refresh = articles.loadState.refresh) {
    is LoadState.Loading -> FullScreenSpinner()
    is LoadState.Error -> FullScreenError(
        message = refresh.error.message,
        onRetry = { articles.retry() }
    )
    is LoadState.NotLoading -> {
        if (articles.itemCount == 0) EmptyState()
        else ArticleList(articles)
    }
}

Indicador de carga al añadir elementos

Para mostrar un indicador de carga pequeño en la parte inferior mientras se carga la página siguiente, añada un elemento adicional al LazyColumn según el estado de carga append.

LazyColumn {
    items(count = articles.itemCount, key = articles.itemKey { it.id }) { index ->
        articles[index]?.let { ArticleRow(it) }
    }

    if (articles.loadState.append is LoadState.Loading) {
        item {
            Box(Modifier.fillMaxWidth().padding(16.dp), Alignment.Center) {
                CircularProgressIndicator()
            }
        }
    }
}

Reintentar en caso de error

Cuando falle una operación de adición, muestre una fila de reintento en la parte inferior. Llamar a articles.retry() vuelve a intentar únicamente la carga que falló; no recarga la lista completa.

val append = articles.loadState.append
if (append is LoadState.Error) {
    item {
        Row(Modifier.fillMaxWidth().padding(16.dp), Arrangement.Center) {
            Text("Couldn't load more")
            Spacer(Modifier.width(8.dp))
            Button(onClick = { articles.retry() }) { Text("Retry") }
        }
    }
}

Deslizar para actualizar

Active una carga nueva con articles.refresh(). Combínela con el gesto de deslizar para actualizar de Material 3 y controle el indicador mediante el estado de carga refresh.

import androidx.compose.material3.pulltorefresh.PullToRefreshBox

val isRefreshing = articles.loadState.refresh is LoadState.Loading
PullToRefreshBox(
    isRefreshing = isRefreshing,
    onRefresh = { articles.refresh() }
) {
    ArticleList(articles)
}

Encabezados y separadores

Puede combinar libremente elementos paginados con contenido no paginado en el mismo LazyColumn. Añada un encabezado fijo, una barra de búsqueda o separadores de secciones alrededor de la llamada paginada a items().

Como todo se encuentra en un único LazyColumn, el desplazamiento permanece unificado y fluido.

LazyColumn {
    item { SearchBar(query, onQueryChange) }

    items(count = articles.itemCount, key = articles.itemKey { it.id }) { index ->
        val article = articles[index]
        if (article != null) {
            ArticleRow(article)
            HorizontalDivider()
        }
    }

    if (articles.loadState.append.endOfPaginationReached) {
        item { Text("You're all caught up", Modifier.padding(16.dp)) }
    }
}

Previsualizar listas paginadas

Para las previsualizaciones y pruebas de Compose no necesita una red real. Envuelva datos de ejemplo en PagingData.from(...) y expóngalos como un flujo.

Esto le permite crear y previsualizar la interfaz de su lista de forma aislada.

import androidx.paging.PagingData
import kotlinx.coroutines.flow.flowOf

@Preview
@Composable
fun ArticleListPreview() {
    val sample = listOf(Article(1, "Hello"), Article(2, "World"))
    val flow = flowOf(PagingData.from(sample))
    ArticleList(flow.collectAsLazyPagingItems())
}

Comprobación rápida

¿Qué función convierte un Flow<PagingData> en algo que un LazyColumn de Compose puede mostrar?

Resumen: Paging en Compose

Ha mostrado datos paginados en Jetpack Compose:

  • collectAsLazyPagingItems() conecta el flujo con la interfaz de usuario
  • La sobrecarga de Paging de items() carga más elementos mientras se desplaza; gestione los espacios reservados null
  • Utilice itemKey { it.id } para obtener claves estables
  • loadState.refresh/append/prepend controla los indicadores de carga, los errores y los estados vacíos
  • retry() y refresh() permiten recuperarse de errores y volver a cargar los datos

Siguiente: combinar la red y la base de datos con RemoteMediator.

Preguntas frecuentes

¿La lección «Paging en listas de Compose» es gratis?

Sí — el texto completo de «Paging en listas de Compose» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Android Academy, actualiza a CoddyKit PRO. El curso de Android Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Paging en listas de Compose»?

Renderice datos paginados con LazyColumn Practicas Android Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Android Academy?

No se requiere experiencia previa. Android Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Paging en listas de Compose»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Android Academy?

Sí. Cada lección de Android Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Por qué usar Paging
  2. PagingSource y Pager
  3. Paging en listas de Compose
  4. RemoteMediator y caché
← Volver a Android Academy