Paging 3 para Kotlin: guía completa con ejemplos prácticos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Paging 3 para Kotlin: guía completa con ejemplos prácticos

1. ¿Qué es y para qué sirve?

Paging 3 es una biblioteca de Google para Android, escrita en Kotlin, que resuelve uno de los problemas más comunes en el desarrollo móvil: la carga de datos por páginas (paginación). Cuando tienes una lista de miles o millones de elementos (como un feed de noticias, mensajes de chat o productos en un catálogo), cargarlos todos de una vez es imposible: provocaría desbordamiento de memoria, congelación de la interfaz y un enorme consumo de datos. Paging 3 automatiza el proceso de cargar datos en lotes (páginas) a medida que el usuario se desplaza por la lista.

La biblioteca está construida sobre principios modernos: usa corrutinas de Kotlin para el trabajo asíncrono, Flow para la actualización reactiva de datos y se integra completamente con Jetpack Compose y RecyclerView. A diferencia de versiones anteriores (Paging 2), Paging 3 ofrece una arquitectura más limpia, menos código repetitivo y soporte integrado para el manejo de errores, actualización de datos y almacenamiento en caché.

El valor principal de Paging 3 es que tú escribes la lógica para cargar una sola página (por ejemplo, una solicitud a una API), y la biblioteca decide por sí misma cuándo solicitar la siguiente, cómo almacenar los datos en memoria, cómo notificar al adaptador sobre los cambios y cómo manejar los estados de carga (cargando, error, lista vacía). Esto ahorra horas de desarrollo y hace que tu aplicación sea estable incluso al trabajar con conjuntos de datos enormes.

2. Instalación

Paging 3 es una biblioteca para Android/Kotlin, por lo que se instala a través del sistema de compilación Gradle, no mediante pip o npm. Agrega la dependencia en tu archivo build.gradle.kts (módulo app):

// build.gradle.kts (Module: app)
dependencies {
    // Biblioteca principal de Paging 3
    implementation("androidx.paging:paging-runtime-ktx:3.3.5")
    
    // Si usas Jetpack Compose (opcional)
    implementation("androidx.paging:paging-compose:3.3.5")
    
    // Si usas RxJava (opcional)
    implementation("androidx.paging:paging-rxjava3:3.3.5")
    
    // Para pruebas (opcional)
    testImplementation("androidx.paging:paging-common:3.3.5")
}

Después de sincronizar Gradle, la biblioteca está lista para usar. La versión mínima del SDK es 21 (Android 5.0).

3. Inicio rápido — ejemplo mínimo funcional

Crearemos una pantalla muy simple que carga una lista de números del 1 al 1000, con 20 elementos por página. El ejemplo consta de tres partes: la fuente de datos (PagingSource), el ViewModel y la interfaz de usuario (RecyclerView).

Paso 1. PagingSource — la fuente de datos

class NumberPagingSource : PagingSource<Int, Int>() {
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Int> {
        return try {
            // Determinamos la clave de la siguiente página (si es null, es la primera carga)
            val currentPage = params.key ?: 0
            val pageSize = params.loadSize  // normalmente 20
            
            // Generamos los datos para la página actual
            val start = currentPage * pageSize
            val end = minOf(start + pageSize, 1000)
            val numbers = (start until end).toList()
            
            // Devolvemos el resultado con las claves para la página siguiente y anterior
            LoadResult.Page(
                data = numbers,
                prevKey = if (currentPage > 0) currentPage - 1 else null,
                nextKey = if (end < 1000) currentPage + 1 else null
            )
        } catch (e: Exception) {
            LoadResult.Error(e)
        }
    }
    
    // Devuelve la clave para recargar (normalmente null o la primera clave)
    override fun getRefreshKey(state: PagingState<Int, Int>): Int? = null
}

Paso 2. ViewModel

class MainViewModel : ViewModel() {
    val pager = Pager(
        config = PagingConfig(pageSize = 20, enablePlaceholders = f                    

Recommendations