Paging

La biblioteca de Paging facilita la carga de datos de forma gradual y correcta en la clase RecyclerView de tu app.

En esta tabla, se enumeran todos los artefactos del grupo androidx.paging.

Artefacto Versión estable actual Próxima versión potencial Versión beta Versión alfa
paging-* 3.0.1 - - 3.1.0-alpha03
paging-compose - - - 1.0.0-alpha12
Esta biblioteca se actualizó por última vez el 21 de julio de 2021

Cómo declarar dependencias

Para agregar una dependencia en Paging, debes agregar el repositorio de Maven de Google a tu proyecto. Consulta el repositorio de Maven de Google para obtener más información.

Agrega las dependencias de los artefactos que necesites en el archivo build.gradle de tu app o módulo:

Groovy

dependencies {
  def paging_version = "3.0.1"

  implementation "androidx.paging:paging-runtime:$paging_version"

  // alternatively - without Android dependencies for tests
  testImplementation "androidx.paging:paging-common:$paging_version"

  // optional - RxJava2 support
  implementation "androidx.paging:paging-rxjava2:$paging_version"

  // optional - RxJava3 support
  implementation "androidx.paging:paging-rxjava3:$paging_version"

  // optional - Guava ListenableFuture support
  implementation "androidx.paging:paging-guava:$paging_version"

  // optional - Jetpack Compose integration
  implementation "androidx.paging:paging-compose:1.0.0-alpha12"
}

Kotlin

dependencies {
  val paging_version = "3.0.1"

  implementation("androidx.paging:paging-runtime:$paging_version")

  // alternatively - without Android dependencies for tests
  testImplementation("androidx.paging:paging-common:$paging_version")

  // optional - RxJava2 support
  implementation("androidx.paging:paging-rxjava2:$paging_version")

  // optional - RxJava3 support
  implementation("androidx.paging:paging-rxjava3:$paging_version")

  // optional - Guava ListenableFuture support
  implementation("androidx.paging:paging-guava:$paging_version")

  // optional - Jetpack Compose integration
  implementation("androidx.paging:paging-compose:1.0.0-alpha12")
}

Obtén información para usar las extensiones de Kotlin en la documentación de ktx.

Para obtener más información sobre las dependencias, consulta Cómo agregar dependencias de compilación.

Comentarios

Tus comentarios ayudan a mejorar Jetpack. Avísanos si descubres nuevos errores o tienes ideas para mejorar esta biblioteca. Consulta los errores existentes en esta biblioteca antes de crear uno nuevo. Para agregar tu voto a un error existente, haz clic en el botón de la estrella.

Cómo crear un error nuevo

Consulta la documentación sobre la Herramienta de seguimiento de errores para obtener más información.

Versión 3.0.0

Versión 3.1.0-alpha03

21 de julio de 2021

Lanzamiento de androidx.paging:paging-*:3.1.0-alpha03. La versión 3.1.0-alpha03 contiene estas confirmaciones.

Cambios en la API

  • Se agregó a PagingSource un tercer LoadResult.Invalid de tipo de datos que se muestra de LoadResult. Cuando PagingSource.load muestre LoadResult.Invalid, la paginación descartará los datos cargados e invalidará PagingSource. Este tipo de datos que se muestra está diseñado para controlar los datos potencialmente no válidos o inactivos que se pueden mostrar desde la base de datos o la red.

    Por ejemplo, si se escribe en la base de datos subyacente, pero PagingSource no se invalida a tiempo, es posible que muestre resultados incoherentes si su implementación depende de la inmutabilidad del conjunto de datos de copia de seguridad desde el que se carga (p. ej., implementaciones de db de estilo LIMIT OFFSET). En este caso, te recomendamos que verifiques la invalidación después de la carga y muestres LoadResult.Invalid, lo que causa que Paging descarte cualquier solicitud de carga pendiente o futura para PagingSource y la invalide.

    Este tipo de datos que se muestra también es compatible con la API de Paging2 que aprovecha LivePagedList o RxPagedList. Cuando se usa PagingSource con las API de PagedList de Paging2, PagedList se desconecta de inmediato, lo que detiene otros intentos de carga de datos en PagedList y activa la invalidación en PagingSource.

    LoadResult es una clase sellada, lo que significa que este cambio no es compatible con la fuente, de modo que los casos de uso en los que se recurre directamente a PagingSource.load deberán controlar LoadResult.Invalid en el tiempo de compilación. Por ejemplo, los usuarios de Kotlin que aprovechen de forma exhaustiva cuándo verificar el tipo de datos que se muestra deberán agregar una verificación para el tipo no válido. (Id6bd3, b/191806126, b/192013267)

Correcciones de errores

  • Las devoluciones de llamada de invalidación que se agregaron a través de PagingSource.registerInvalidatedCallback o DataSource.addInvalidatedCallback ahora se activan automáticamente si estaban registradas en un PagingSource o DataSource que ya no era válido. De esta manera, se soluciona una condición de carrera que causaba que Paging descartara las señales de invalidación y se detuviera cuando se brindaba una fuente que ya no era válida durante la carga inicial. Además, las devoluciones de llamada no válidas ahora se quitan de manera correcta después de que se activan, ya que se garantiza que se las llamará como máximo una vez. (I27e69)
  • Si se envía el valor inicial del marcador de posición (InitialPagedList) desde una transmisión de PagedList cuya instancia se acaba de crear, p. ej., LivePagedListBuilder o RxPagedListBuilder, ya no se borrarán los datos cargados anteriormente.

Versión 3.1.0-alpha02

1 de julio de 2021

Lanzamiento de androidx.paging:paging-*:3.1.0-alpha02. La versión 3.1.0-alpha02 contiene estas confirmaciones.

Nuevas funciones

  • Se agregaron las API de presentación de objetos de escucha y flujos onPagesPresented, que se activan inmediatamente después de que se actualizan las páginas presentadas en la IU.

    Dado que estas actualizaciones son síncronas con la IU, puedes llamar a métodos de adaptador, como .snapshot y .getItemCount, para inspeccionar el estado después de que se aplique la actualización. Ten en cuenta que se dejó .snapshot() para llamarlo de manera explícita, ya que puede ser costoso hacerlo en cada actualización.

    Las actualizaciones de página pueden ocurrir en las siguientes situaciones:

    • Se completa la carga inicial de una generación nueva de PagingData, sin importar si esta generación contiene algún cambio en los elementos presentados. Por ejemplo, se seguirá activando esta devolución de llamada cuando una generación nueva complete la carga inicial sin actualizaciones porque la lista es exactamente la misma.
    • Se inserta una página, incluso si la página insertada no contiene elementos nuevos.
    • Se omite una página, incluso si está vacía. (I272c9, b/189999634).

Correcciones de errores

  • El acceso a PagedList.dataSource desde el valor inicial producido por LivePagedList o RxPagedList ya no arrojará una excepción IllegalStateException de forma incorrecta. (I96707).

Versión 3.1.0-alpha01

2 de junio de 2021

Lanzamiento de androidx.paging:paging-*:3.1.0-alpha01. La versión 3.1.0-alpha01 contiene estas confirmaciones.

Cambios en la API

  • Ahora, las clases que brinda paging-rxjava3 se incluyen en el paquete androidx.paging.rxjava3, para que no entren en conflicto con paging-rxjava2. (Ifa7f6)

Correcciones de errores

  • Se corrigió un error por el que, en ocasiones, Paging enviaba distintos eventos no-op a RecyclerView, por lo que algunos objetos de escucha podían activarse antes. (Ic507f, b/182510751)

Contribución externa

  • Se agregaron API obsoletas de PagedList compat al artefacto rxjava3. (Id1ce2, b/182497591)

Paging Compose versión v1.0.0

Versión 1.0.0-alpha12

21 de julio de 2021

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha12. La versión 1.0.0-alpha12 contiene estas confirmaciones.

Cambios en la API

  • Los objetos items(lazyPagingItems) y itemsIndexed(lazyPagingItems) que se usan para conectar Paging con LazyColumn/Row ahora aceptan el parámetro clave de opción que te permite especificar una clave estable que representa el elemento. Puedes obtener aquí más información sobre las claves. (I7986d)
  • La función lazyPagingItems.getAsState(index) dejó de estar disponible. Usa lazyPagingItems[index] en su lugar. (I086cb, b/187339372)

Versión 1.0.0-alpha11

30 de junio de 2021

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha11. La versión 1.0.0-alpha11 contiene estas confirmaciones.

Versión 1.0.0-alpha10

2 de junio de 2021

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha10. La versión 1.0.0-alpha10 contiene estas confirmaciones.

Versión 1.0.0-alpha09

18 de mayo de 2021

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha09. La versión 1.0.0-alpha09 contiene estas confirmaciones.

Correcciones de errores

  • itemCount y el método get de item de LazyPagingItems ahora son observables, lo que permite que se utilice con LazyVerticalGrid también. (Ie2446, b/171872064, b/168285687)

Compatibilidad con Compose

  • androidx.paging:paging-compose:1.0.0-alpha09 solo es compatible con Compose 1.0.0-beta07 y versiones posteriores.

Versión 1.0.0-alpha08

24 de febrero de 2021

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha08. La versión 1.0.0-alpha08 contiene estas confirmaciones.

Se actualizó para integrarse a Compose 1.0.0-beta01.

Versión 1.0.0-alpha07

10 de febrero de 2021

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha07. La versión 1.0.0-alpha07 contiene estas confirmaciones.

Se actualizó para integrarse a Compose alpha12.

Versión 1.0.0-alpha06

28 de enero de 2021

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha06. La versión 1.0.0-alpha06 contiene estas confirmaciones.

Correcciones de errores

Se actualizó para depender de Compose 1.0.0-alpha11.

Versión 1.0.0-alpha05

13 de enero de 2021

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha05. La versión 1.0.0-alpha05 contiene estas confirmaciones.

Se actualizó para depender de Compose 1.0.0-alpha10.

Versión 1.0.0-alpha04

16 de diciembre de 2020

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha04. La versión 1.0.0-alpha04 contiene estas confirmaciones.

Correcciones de errores

  • Se actualizaron las propiedades de conveniencia, CombinedLoadStates.refresh, CombinedLoadStates.prepend, CombinedLoadStates.append, para pasar de Loading a NotLoading después de que los estados de mediador y de carga fuente se conviertan en NotLoading a fin de garantizar que se aplicó la actualización remota. (I65619)

Versión 1.0.0-alpha03

2 de diciembre de 2020

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha03. La versión 1.0.0-alpha03 contiene estas confirmaciones.

  • Se actualizó para que coincida con Compose 1.0.0-alpha08.

Versión 1.0.0-alpha02

11 de noviembre de 2020

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha02. La versión 1.0.0-alpha02 contiene estas confirmaciones.

Cambios en la API

  • Se agregaron los métodos .peek(), .snapshot(), .retry() y .refresh() a LazyPagingItem, que exponen la misma funcionalidad disponible en AsyncPagingDataDiffer/PagingDataAdapter(Iddfe8, b/172041660)

Versión 1.0.0-alpha01

28 de octubre de 2020

Lanzamiento de androidx.paging:paging-compose:1.0.0-alpha01. La versión 1.0.0-alpha01 contiene estas confirmaciones.

Nuevas funciones

El artefacto paging-compose proporciona integración entre la biblioteca de Paging y Jetpack Compose. Ejemplo de uso simple:

  @Composable
  @OptIn(ExperimentalLazyDsl::class)
  fun ItemsDemo(flow: Flow<PagingData<String>>) {
      val lazyPagingItems = flow.collectAsLazyPagingItems()
      LazyColumn {
          items(lazyPagingItems) {
              Text("Item is $it")
          }
      }
  }

Versión 3.0.1

Versión 3.0.1

21 de julio de 2021

Lanzamiento de androidx.paging:paging-*:3.0.1. La versión 3.0.1 contiene estas confirmaciones.

Correcciones de errores

  • Si accedes a PagedList.dataSource desde el valor inicial que produce LivePagedList o RxPagedList, ya no se arrojará una excepción IllegalStateException de forma incorrecta. (I96707)

Versión 3.0.0

Versión 3.0.0

5 de mayo de 2021

Lanzamiento de androidx.paging:paging-*:3.0.0. La versión 3.0.0 contiene estas confirmaciones.

Funciones principales de la versión 3.0.0

Se dio de baja gran parte de la API existente de Paging 2.xx y se la reemplazó por las nuevas API de Paging 3 que ofrecen las siguientes mejoras:

  • Compatibilidad de primer nivel con las corrutinas y el flujo de Kotlin
  • Compatibilidad con la cancelación
  • Estado de carga integrado y señales de error integrados
  • Funcionalidad reintentar + actualizar
  • Se combinaron las tres subclases de DataSource en una clase unificada de PagingSource
  • Transformaciones de página personalizadas, como una integrada para agregar separadores
  • Carga de pies de página y encabezados de estado

Versión 3.0.0-rc01

21 de abril de 2021

Lanzamiento de androidx.paging:paging-*:3.0.0-rc01. La versión 3.0.0-rc01 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigió un error por el que, en ocasiones, Paging enviaba distintos eventos no-op a RecyclerView, por lo que algunos objetos de escucha podían activarse antes. (Ic507f, b/182510751)

Versión 3.0.0-beta03

24 de marzo de 2021

Lanzamiento de androidx.paging:paging-*:3.0.0-beta03. La versión 3.0.0-beta03 contiene estas confirmaciones.

Correcciones de errores

  • Se renovó la manera en que se controlan los marcadores de posición cuando se vuelve a cargar la lista para evitar saltos inesperados en RecyclerView. Para conocer más detalles, consulta NullPaddedDiffer.md. (If1490, b/170027529, b/177338149)
  • Los distintos compiladores PagedList (ruta de compatibilidad antigua) ya no llaman de manera incorrecta a DataSource.Factory.create() en la conversación principal cuando se llama a .build(). (b/182798948)

Versión 3.0.0-beta02

10 de marzo de 2021

Lanzamiento de androidx.paging:paging-*:3.0.0-beta02. La versión 3.0.0-beta02 contiene estas confirmaciones.

Cambios en la API

  • Las extensiones Rx3 ahora propagan de forma correcta el requisito de participación @ExperimentalCoroutinesApi. Anteriormente, se marcaban en el método @get, que el compilador de Kotlin ignoraba debido a https://youtrack.jetbrains.com/issue/KT-45227. (I5733c)

Correcciones de errores

  • Se aplicaron restricciones sobre el uso público de las API experimentales. (I6aa29, b/174531520)
  • Se corrigió un error que provocaba que PagingState siempre fuera null cuando se llamaba a la actualización remota.
  • Se corrigió un error por el que las páginas vacías que mostraba PagingSource no permitían que Paging se recuperara de nuevo para completar prefetchDistance, lo que provocaba que se detenga.

Versión 3.0.0-beta01

10 de febrero de 2021

Lanzamiento de androidx.paging:paging-*:3.0.0-beta01. La versión 3.0.0-beta01 contiene estas confirmaciones.

Cambios en la API

  • Ahora, los wrappers Rx2 y Rx3 exponen la anotación experimental de la que depende. Si usas los wrappers de compat de Rx en Paging-rxjava2 o Paging-rxjava3, ahora deberás anotar los usos con @OptIn(ExperimentalCoroutinesApi::class). (Ib1f9d)

Correcciones de errores

  • Se corrigió IndexOutOfBoundsException: Inconsistency detected que a veces se producía cuando se usaban API de DataSource v2 a través de rutas de compatibilidad.
  • La llamada isInvalid durante la inicialización de DataSource cuando se usan a través de rutas de compatibilidad ahora se inician correctamente en fetchDispatcher en lugar del subproceso principal. Esto corrige un IllegalStateException debido al acceso a Db en el subproceso principal cuando se usa la implementación PagingSource de Room.

Versión 3.0.0-alpha13

27 de enero de 2021

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha13. La versión 3.0.0-alpha13 contiene estas confirmaciones.

Cambios en la API

  • La implementación de PagingSource.getRefreshKey ya no es opcional. Ahora es una función abstracta sin una implementación predeterminada. La migración de usuarios puede seguir mostrando la implementación predeterminada, que solo muestra null, pero getRefreshKey() debe tener una implementación real que muestre una clave basada en la posición actual de desplazamiento del usuario que permite a Paging seguir cargando en el viewport a través de PagingState.anchorPosition, si es posible. (I4339a)
  • Ahora, InvalidatingPagingSourceFactory es una clase final. (Ia3b0a)
  • Se permite la configuración del comportamiento del separador de terminal (encabezado/pie de página) con un parámetro opcional SeparatorType adicional. Estas son las dos opciones:
    • FULLY_COMPLETE: Comportamiento existente; debes esperar a PagingSource y RemoteMediator para marcar el endOfPaginationReached antes de agregar separadores de terminales. Si no se utiliza RemoteMediator, se ignora el loadState remoto. Esto es muy útil si solo deseas mostrar separadores de sección cuando esta se carga por completo, incluida la recuperación de la fuente remota, p. ej., la red.
    • SOURCE_COMPLETE: Solo espera que PagingSource marque endOfPaginationReachect, incluso si se usa RemoteMediator. Esto permite que los encabezados y pies de página se presenten de forma síncrona con la carga inicial, lo que evita que los usuarios tengan que desplazarse para ver los separadores de terminal. (Ibe993, b/174700218)

Correcciones de errores

  • Se corrigió una fuga de memoria poco frecuente que se produce cuando se invalida un PagingSource antes de que PageFetcher incluso pueda comenzar a cargarla desde ahí. (I9606b, b/174625633)

Versión 3.0.0-alpha12

13 de enero de 2021

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha12. La versión 3.0.0-alpha12 contiene estas confirmaciones.

Cambios en la API

  • InvalidatingPagingSourceFactory dejará de ser una clase abstracta, ya que nunca tuvo ningún método abstracto. (I4a8c4)
  • Se agregó una sobrecarga de .cachedIn() que acepta ViewModel en lugar de Lifecycle o CoroutineScope para los usuarios de Java. (I97d81, b/175332619)
  • Permite que los emisores de Java usen operaciones de transformación de PagingData de manera asíncrona mediante la aceptación de un Ejecutor en los argumentos del operador de transformación. Todos los operadores de transformación de -Sync ahora tienen el sufijo "-Sync", y los usuarios de las corrutinas de Kotlin deberán desambiguarlas llamando a la función de extensión, que acepta un bloqueo suspendido. Todos los operadores de transformación de PagingData se movieron a extensiones de la clase PagingDataTransforms estática. Los usuarios de Java deberán llamarlos con asistentes estáticos, como p. ej., PagingDataTransforms.map(pagingData, transform). Para los usuarios de Kotlin, la sintaxis es la misma, pero deberán importar la función. (If6885, b/172895919)

Correcciones de errores

  • Se corrigió un error en el que no se llamaba a RemoteMediator.load() durante adapter.refresh() si el final de la paginación ya se había alcanzado.

Versión 3.0.0-alpha11

16 de diciembre de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha11. La versión 3.0.0-alpha11 contiene estas confirmaciones.

Nuevas funciones

  • Se agregó compatibilidad con estados guardados para los siguientes casos de uso básicos (compatibilidad total, aunque, en el caso de origen en capas, todavía se encuentra en proceso):
    • El flujo se almacena en caché y la aplicación no se cierra (p. ej., el flujo se almacena en caché en un modelo de vista y la actividad se vuelve a crear en el proceso).
    • Se cuenta la fuente de paginación, se habilitan los marcadores de posición, y el diseño no es escalonado.

Cambios en la API

  • Ahora, PagingSource.getRefreshKey() es una API estable. (I22f6f, b/173530980)
  • PagingSource.invalidate ya no es una función abierta. Si necesitas recibir una notificación cuando se produce una invalidación, procura llamar al método registerInvalidedCallback en lugar de anular la invalidación. (I628d9, b/173029013, b/137971356)
  • Ahora, Pager tiene un solo constructor experimental junto a sus constructores regulares, en lugar de filtrar las API experimentales en una API pública no experimental mediante la anotación de participación. (I9dc61, b/174531520)
  • Se actualizaron las propiedades de conveniencia, CombinedLoadStates.refresh, CombinedLoadStates.prepend, CombinedLoadStates.append, para pasar de Loading a NotLoading después de que los estados de mediador y de carga fuente se conviertan en NotLoading a fin de garantizar que se aplicó la actualización remota. (I65619)
  • Se quitó LoadParams.pageSize (ya era obsoleto). Se recomienda usar LoadParams.loadSize en tu PagingSource.

    LoadParams.loadSize siempre es igual a PagingConfig.pageSize, excepto para la llamada de carga inicial, en la que es igual a PagingConfig.initialLoadSize.

    Si estás probando tu DataSource de Paging2 sin usar un elemento Pager PagedList, es posible que pageSize no coincida con PagingConfig.pageSize si también configuras initialLoadSize. Si es importante para tus pruebas, usa un elemento Pager/PagedList, que establecerá internamente el valor correcto de Pager/PagedList para tus métodos de carga de DataSource. (I98ac7, b/149157296)

Correcciones de errores

  • Se corrigió una falla debido a IllegalStateException cuando se usaban separadores con PagingConfig.maxSize. (I0ed33, b/174787528)
  • Se corrigió un error en el que el estado de carga de PREPEND/APPEND no se actualizaba a NotLoading(endOfPaginationReached = true) inmediatamente después de la carga inicial si se configuraba RemoteMediator. (I8cf5a)
  • Se corrigió un error por el que las API del presentador, .snapshot(), .peek(), etc., mostraban una lista anterior (desactualizada) dentro de las actualizaciones de ListUpdateCallback.
  • Se corrigió un error por el cual los operadores de los separadores no agregaban encabezados ni pies de página cuando se usaban con RemoteMediator.
  • Se corrigió un error por el que las actualizaciones de LoadState a NotLoading para RemoteMediator se bloqueaban en el estado de carga.
  • Se corrigió un error en el que la API de compatibilidad de Paging2.0, .asPagingSourceFactory(), podía provocar que se inicializara el objeto DataSource de copia de seguridad en el CoroutineDispatcher incorrecto. Esta corrección resuelve un bloqueo y posibles casos de ANR, especialmente cuando se usa la implementación actual de PagingSource de Room, que usa esta ruta de compatibilidad.

Versión 3.0.0-alpha10

2 de diciembre de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha10. La versión 3.0.0-alpha10 contiene estas confirmaciones.

Cambios en la API

  • Se quitaron las API dataRefreshFlow y dataRefreshListener obsoletas, ya que son redundantes con las actualizaciones del objeto loadStateFlow/Listener. Para quienes migran, el equivalente loadStateFlow es el siguiente:

    loadStateFlow.distinctUntilChangedBy { it.refresh }
        .filter { it.refresh is NotLoading }
    

    (Ib5570, b/173530908)

Correcciones de errores

  • endOfPaginationreached para RemoteMediator REFRESH ahora se propaga correctamente a las actualizaciones de LoadState y evita que se activen APPEND y PREPEND. (I94a3f, b/155290248)
  • Presentar una lista vacía, ya sea debido a una página inicial vacía o un filtrado pesado, ya no impedirá que Paging inicie las cargas PREPEND o APPEND. (I3e702, b/168169730)
  • Se solucionó un problema en el que no se llamaba a getRefreshKey en las generaciones posteriores de PagingSource cuando se producían invalidaciones. (I45460, b/170027530)

Contribución externa

  • Se agregó una nueva clase abstracta InvalidationPagingSourceFactory con una API de .invalidate() que reenvía la invalidación a todas las PagingSources que emite. Gracias a @claraf3. (Ie71fc, b/160716447)

Errores conocidos

  • Es posible que los encabezados y pies de página de la transformación .insertSeparators() no aparezcan inmediatamente cuando se usa RemoteMediator. b/172254056
  • El uso de RemoteMediator puede hacer que LoadState remoto se detenga si se produce una invalidación y que PagingSource.load(LoadParams.Refresh(...)) se complete antes de que RemoteMediator.load() se muestre. b/173717820.

Versión 3.0.0-alpha09

11 de noviembre de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha09. La versión 3.0.0-alpha09 contiene estas confirmaciones.

Cambios en la API

  • Los métodos dataRefreshFlow y Listener dejaron de estar disponibles completamente con una cláusula replaceWith. (I6e2dd)

Correcciones de errores

  • Se corrigió la aparición de IllegalArgumentException cuando se usaban separadores con RemoteMediator y se activaba una invalidación mientras se seguía ejecutando una carga remota que muestra endOfPagination. (I3a260)

Versión 3.0.0-alpha08

28 de octubre de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha08. La versión 3.0.0-alpha08 contiene estas confirmaciones.

Cambios en la API

  • Se habilitaron las conversiones SAM en Kotlin con una interfaz funcional, disponible en Kotlin 1.4, a fin de combinar las variantes de Kotlin/Java de DataSource.InvalidatedCallback. Eso también corrige un error en el que no se llamaba a la variante de Kotlin de las devoluciones de llamada no válidas después de la transformación de .map o .mapByPage (I1f244, b/165313046).

Correcciones de errores

  • Se mejoró considerablemente la interacción de Paging con ViewPager. En particular, Paging ya no cancelará una llamada de RemoteMediator#load por una invalidación de página. Además, dejará de enviar una solicitud de carga adicional o de preparación hasta que se complete correctamente la solicitud de actualización REFRESH, si una actualización con REFRESH es necesaria (I6390b, b/162252536).
  • Se habilitó la comprobación de lint de API para MissingGetterMatchingBuilder en androidx (I4bbea, b/138602561).
  • Se corrigió un error por el cual los ayudantes de ConcatAdapter .withLoadState* fallaban debido a la notificación de RecyclerView desde el subproceso en segundo plano (I18bb5, b/170988309).
  • Se corrigió un error por el que cargar una página muy pequeña que no estaba vacía, en ocasiones, evitaba que la carga previa capture cargas correctamente (Iffda3, b/169259468).

Versión 3.0.0-alpha07

1 de octubre de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha07. La versión 3.0.0-alpha07 contiene estas confirmaciones.

Cambios en la API

  • Los operadores asíncronos basados en Guava para PagingData ahora aceptan un ejecutor como parámetro para controlar el contexto de ejecución (Id4372).

Correcciones de errores

  • Se corrigió la excepción IndexOutOfBounds arrojada en RemoteMediator debido a una condición de carrera (I00b7f, b/165821814).
  • Se corrigió una condición de carrera en la conversión DataSource -> PagingSource que podría hacer que PagingSource omita las señales de invalidación de DataSource.
  • Se solucionó un problema en la lógica de obtención de páginas que, a veces, hacía que no se recogieran nuevas generaciones de PagingSource hasta que se invocara PagingDataAdapter.refresh().
  • Se solucionó un problema que provocaba que la posición de desplazamiento, a veces, se perdiera cuando se usaba un DataSource convertido en un PagingSource (como el que se producía en Room), junto con RemoteMediator.

Contribución externa

  • Gracias a @simonsilleriller por agregar RxJava2, RxJava3 y operadores de transformación asincrónica basados en Guava para PagingData.

Versión 3.0.0-alpha06

2 de septiembre de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha06. La versión 3.0.0-alpha06 contiene estas confirmaciones.

Cambios en la API

  • Ahora, UnsupportedOperationException con mensajería más clara sobre la falta de compatibilidad para los ID estables se produce cada vez que se llama a PagingDataAdapter.setHasStableIds (Ib3890, b/158801427).

Correcciones de errores

  • InsertSeparators ya no filtra las páginas vacías que permiten que el presentador conozca la distancia de carga previa, incluso en los casos en que se insertan muchas páginas vacías (I9cff6, b/162538908).

Versión 3.0.0-alpha05

19 de agosto de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha05. La versión 3.0.0-alpha05 contiene estas confirmaciones.

Correcciones de errores

  • Paging ahora realiza en forma correcta la carga previa de páginas, incluso cuando los datos presentados tienen muchos filtros.
  • Mostrar LoadResult.Error luego de reintentar una carga ya no provoca que los accesos a elementos vuelvan a activar incorrectamente otro reintento.

Contribución externa

  • ¡Gracias, Clara F por ayudar a mejorar algunas pruebas! (549612).

Versión 3.0.0-alpha04

5 de agosto de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha04. La versión 3.0.0-alpha04 contiene estas confirmaciones.

Cambios en la API

  • Se agregó la API de peek() a AsyncPagingDataDiffer y PagingDataAdapter para permitir el acceso a los datos presentados sin que se activen las cargas de página (I38898, b/159104197).
  • Se agregó una API de snapshot() a PagingDataAdapter y AsyncPagingDataDiffer para poder recuperar los elementos presentados sin activar la recuperación de la página (I566b6, b/159104197).
  • Se agregó un constructor de PagingData.from(List<T>) que permite presentar listas estáticas, las cuales pueden combinarse con el flujo general de PagingData, a fin de mostrarlas en ciertos estados; p. ej., antes de que termine la actualización REFRESH inicial o simplemente para probar las transformaciones (Id134d).
  • Las API de objeto de escucha y flujo dataRefresh dejaron de estar disponibles, ya que estaban diseñadas para exponer el estado de los elementos presentados en una actualización con REFRESH. Sin embargo, resultaron redundantes a partir de las mejoras en el tiempo de devolución de llamada del flujo y el objeto de escucha loadState y la propiedad itemCount (Ia19f3).
  • Se agregaron wrappers de compatibilidad de RxJava3 para PagingSource y RemoteMediator. (I49ef3, b/161480176)

Correcciones de errores

  • Los PositionalDataSource se convirtieron en PagingSource a través del ayudante toPagingSourceFactory, incluido el PagingSource generado por Room. Ahora se marcan correctamente para admitir saltos. (I3e84c, b/162161201).
  • Se corrigió un error en el que la variante síncrona de submitData a veces provocaba una carrera y causaba una ClosedSendChannelException (I4d702, b/160192222).

Contribución externa

  • ¡Agradecemos a Zac Sweers por agregar wrappers de compatibilidad de RxJava3 en nombre de Slack! (I49ef3, b/161480176).

Versión 3.0.0-alpha03

22 de julio de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha03. La versión 3.0.0-alpha03 contiene estas confirmaciones.

Cambios en la API

  • El constructor de PagingState ahora es público, lo que debería facilitar la implementación de pruebas de getRefreshKey() (I8bf15).
  • Se ocultaron de Java las variantes de función del método map de Kotlin DataSource para resolver la ambigüedad entre las variantes originales y las de Kotlin (If7b23, b/161150011).
  • Se marcaron con @JvmSynthetic las API redundantes incluidas para mayor comodidad de los usuarios de Kotlin (I56ae5).
  • Se agregaron sobrecargas para el constructor de LoadResult.Page, que establece los valores predeterminados de itemsBefore y itemsAfter en COUNT_UNDEFINED (I47849).
  • Los operadores existentes de PagingData aceptan métodos con suspensión y se introdujeron los nuevos operadores sin suspensión mapSync, flatMapSync y filterSync para los usuarios de Java. Se trasladaron los métodos de transformación existentes a funciones de extensión, por lo que los usuarios de Kotlin ahora deberán importarlos (I34239, b/159983232).

Correcciones de errores

  • Room (y PositionalDataSource) PagingSources mostrará un separador principal como parte de la primera página, por lo que el usuario no necesita desplazarse para revelarlo (I6f747, b/160257628).
  • Los accesos de elementos en marcadores de posición ahora activan correctamente las cargas de PagingSource hasta que se muestre una página que cumpla con el índice solicitado después de que lo transforme PagingData.filter() (I95625, b/158763195).
  • Se corrigió un error en el que, a veces, el desplazamiento después de que PagingSource mostraba un error podía impedir los reintentos de PagingDataAdapter.retry() (I1084f, b/160194384).
  • Se solucionó un problema en el que los accesos a elementos después de soltar una página no cargaban páginas aunque el acceso a los elementos estaba dentro de prefetchDistance (Ie95ae, b/160038730).
  • La configuración de PagingConfig.maxSize ya no habilita los marcadores de posición después de un evento de soltar (I2be29, b/159667766).

Versión 3.0.0-alpha02

24 de junio de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha02. La versión 3.0.0-alpha02 contiene estas confirmaciones.

Cambios en la API

  • Se agregaron sobrecargas para el constructor de PagingConfig con valores predeterminados comunes (I39c50 y b/158576040).
  • Se agregaron sobrecargas para constructores de PagingDataAdapter y AsyncPagingDataDiffer con valores predeterminados comunes (Ie91f5).
  • Las API de Adapter, dataRefreshFlow y dataRefreshListener, ahora pasan un valor booleano para indicar si un PagingData está vacío (I6e37e y b/159054196).
  • Se agregaron las API de RxJava y Guava para RemoteMediator: RxRemoteMediator y ListenableFutureRemoteMediator.
  • Se agregaron ayudantes a PagingState para el acceso de elementos comunes, como isEmpty() y firstItemOrNull() (I3b5b6 y b/158892717).

Correcciones de errores

  • Pager ahora verifica la reutilización de PagingSource en la fábrica para evitar la reutilización accidental de PagingSources no válidos, lo que generaba un error poco claro (I99809 y b/158486430).
  • Las fallas de REFRESH de RemoteMediator ya no impiden que se cargue PagingSource (I38b1b y b/158892717).
  • La versión sin suspensión de submitData ya no causa una falla debido a la recopilación simultánea en múltiples PagingData cuando se llama al elemento después de la versión con suspensión de submitData. (I26358 y b/158048877).
  • Se corrigió la excepción "Cannot collect twice from pager" (No se puede recopilar dos veces de Pager) que podía ocurrir después del cambio de configuración. (I58bcc, b/158784811)

Versión 3.0.0-alpha01

10 de junio de 2020

Lanzamiento de androidx.paging:paging-*:3.0.0-alpha01. La versión 3.0.0-alpha01 contiene estas confirmaciones.

Se actualizó la biblioteca de Paging a la versión 3.0 para habilitar varias funciones nuevas.

Nuevas funciones de la versión 3.0

Errores conocidos

  • Los javadocs de Paging 3 aún no están disponibles. Mientras tanto, usa las guías que se mencionan arriba o los documentos de Kotlin (b/158614050).

Versión 2.1.2

Versión 2.1.2

18 de marzo de 2020

Lanzamiento de androidx.paging:paging:2.1.2. La versión 2.1.2 contiene estas confirmaciones en relación con la versión 2.1.0.

Correcciones de errores

  • Corrección para IndexOutOfBoundsException en casos excepcionales cuando se convierte una posición durante la invalidación.

Problema de lanzamiento

  • La versión 2.1.1 de Paging se lanzó de forma incorrecta desde una rama mal configurada, lo que expuso las API y la funcionalidad parcialmente implementadas que se lanzarán en una versión futura.

  • Paging 2.1.2 contiene la corrección de centrado de carga que se publicó originalmente en la versión 2.1.1, pero esta se elige correctamente sobre la versión 2.1.0. Si estás usando la versión 2.1.1, te recomendamos que actualices a esta versión.

Versión 2.1.1

Versión 2.1.1

18 de diciembre de 2019

Lanzamiento de androidx.paging:paging-*:2.1.1. La versión 2.1.1 contiene estas confirmaciones.

Correcciones de errores

  • Ahora se centran las cargas iniciales contiguas de PositionalDataSources en torno al último acceso cuando se inhabilitan los marcadores de posición.

Versión 2.1.0

Versión 2.1.0

25 de enero de 2019

Lanzamiento de Paging 2.1.0 sin cambios desde 2.1.0-rc01.

Versión 2.1.0-rc01

6 de diciembre de 2018

Lanzamiento de Paging 2.1.0-rc01 sin cambios desde 2.1.0-beta01.

Versión 2.1.0-beta01

1 de noviembre de 2018

Lanzamiento de Paging 2.1.0-beta01 sin cambios desde 2.1.0-alpha01.

Versión 2.1.0-alpha01

12 de octubre de 2018

Paging 2.1.0-alpha01 tiene dos incorporaciones importantes: arrastre de páginas y bibliotecas de extensión de KTX para cada artefacto, además de muchas otras correcciones de errores y modificaciones en la API.

Cambios en la API

  • Se agregó PagedList.Config.Builder.setMaxSize() para limitar el número de elementos cargados en la memoria.
  • Se agregó androidx.paging.Config() como una alternativa de Kotlin para PagedList.Config.Builder.
  • Se agregó androidx.paging.PagedList() como una alternativa de Kotlin para PagedList.Builder.
  • Se agregó DataSourceFactory.toLiveData() como una alternativa de Kotlin para LivePagedListBuilder.
  • Se agregaron DataSourceFactory.toObservable() y toFlowable() como alternativas de Kotlin para RxPagedListBuilder.
  • Se agregó AsyncPagedListDiffer.addPagedListListener() para escuchar cambios de PagedList. (b/111698609)
  • Se agregó la variante PagedListAdapter.onCurrentListChanged() que pasa la lista anterior y la nueva. La variante anterior dejó de estar disponible.
  • Se agregaron variantes PagedListAdapter/AsyncPagedListDiffer.submitList() que realizan una devolución de llamada adicional que se activa si/cuando se muestra pagedlist, después de diffing. De esta manera, puedes sincronizar un intercambio de PagedList con otras actualizaciones de IU (b/73781068).
  • Se agregó PagedList.getLoadedCount() para informarte cuántos elementos hay en la memoria. Ten en cuenta que el valor que se muestra es siempre igual a .size() si los marcadores de posición están inhabilitados.

Correcciones de errores

  • Se corrigió una condición de carrera durante el diffing si se reutilizan las listas. b/111591017
  • Ahora PagedList.loadAround() muestra IndexOutOfBoundsException cuando el índice no es válido. Anteriormente, fallaba sin proporcionar una excepción clara.
  • Se corrigió un error por el que un tamaño de carga inicial extremadamente pequeño junto con datos sin modificar hacían que la carga no continuara. b/113122599

Versión 2.0.0

Versión 2.0.0

1 de octubre de 2018

Lanzamiento de Paging 2.0.0 con una sola corrección de errores.

Correcciones de errores

  • Se corrigió un error que ocurría con desplazamientos rápidos mediante PositionalDataSource y marcadores de posición b/114635383.

Versión 2.0.0-beta01

2 de julio de 2018

Correcciones de errores

  • Se corrigió el contenido que desaparecía en algunos casos anexados (marcadores de posición inhabilitados, PositionalDataSource). b/80149146
  • (Ya se lanzó en 1.0.1) Se solucionaron fallas en las que PagedListAdapter y AsyncPagedListDiffer no identificaban eventos de movimiento. b/110711937

Dependencias anteriores a AndroidX

Para las siguientes versiones de Paging anteriores a AndroidX, incluye estas dependencias:

dependencies {
    def paging_version = "1.0.0"

    implementation "android.arch.paging:runtime:$paging_version"

    // alternatively - without Android dependencies for testing
    testImplementation "android.arch.paging:common:$paging_version"

    // optional - RxJava support
    implementation "android.arch.paging:rxjava2:$paging_version"
}

Versión 1.0.1

Versión 1.0.1

26 de junio de 2018

Lanzamiento de Paging 1.0.1 con una sola corrección de errores en runtime. Recomendamos usar 1.0.1 para mayor estabilidad. También se lanzó Paging RxJava2 1.0.1 y es idéntico a 1.0.0-rc1.

Correcciones de errores

  • Se solucionaron fallas en las que PagedListAdapter y AsyncPagedListDiffer no identificaban eventos de movimiento. b/110711937

RxJava2 versión 1.0.0

RxJava2 versión 1.0.0-rc1

16 de mayo de 2018

Paging RxJava2 1.0.0-rc1 pasa a la versión potencial sin cambios respecto de la versión alfa inicial.

Versión 1.0.0

Versión 1.0.0-rc1

19 de abril de 2018 Versión potencial de Paging

No tenemos problemas conocidos o características nuevas previstos para el lanzamiento de Paging 1.0.0. Actualiza tus proyectos para usar 1.0.0-rc1 y ayúdanos a ponerlo a prueba para que podamos crear una versión 1.0.0 confiable.

No hay cambios en esta versión, es igual a 1.0.0-beta1.

Versión 1.0.0-beta1

5 de abril de 2018

Paging estará en versión beta durante un breve período de tiempo antes de pasar a la versión potencial. No tenemos planificado ningún cambio adicional de API para Paging 1.0 y los estándares para cambios de API son muy altos.

Lanzamiento de compatibilidad alfa de RxJava2 con Paging como módulo opcional por separado (android.arch.paging:rxjava2:1.0.0-alpha1). Tendrá una versión por separado temporalmente hasta que se estabilice.

Esta biblioteca nueva proporciona una alternativa a RxJava2 respecto de LivePagedListBuilder, capaz de crear objetos Observable y Flowable, y de tomar objetos Scheduler en lugar de Executor:

Kotlin

val pagedItems = RxPagedListBuilder(myDataSource, /* page size */ 50)
        .setFetchScheduler(myNetworkScheduler)
        .buildObservable()

Java

Observable<PagedList<Item>> pagedItems =
        RxPagedListBuilder(myDataSource, /* page size */ 50)
                .setFetchScheduler(myNetworkScheduler)
                .buildObservable();

Nuevas funciones

  • Se agrega RxPagedListBuilder mediante el nuevo artefacto android.arch.paging:rxjava2.

Cambios en la API

  • Cambios de API para aclarar el rol de los ejecutores en los compiladores.

    • El nombre de setBackgroundThreadExecutor() cambió a setFetchExecutor() (en PagedList.Builder y LivePagedListBuilder).

    • El nombre de setMainThreadExecutor() cambió a setNotifyExecutor() (en PagedList.Builder).

  • Se corrigió el miembro PagedList.mCallbacks para que sea privado.

Correcciones de errores

  • LivePagedListBuilder activa una carga inicial de PagedList en el ejecutor especificado, en lugar de hacerlo en el grupo de subprocesos de IO de los componentes de la arquitectura.

  • Se corrigió un comportamiento no válido en wrappers DataSource internos (que se usan para implementar DataSource.map, además de la carga de PositionalDataSource inhabilitada para marcadores de posición). (b/77237534).

Versión 1.0.0-alpha7

21 de marzo de 2018

Lanzamiento de Paging 1.0.0-alpha7 junto con Lifecycles 1.1.1. Como Paging alpha7 depende del movimiento de la clase Function mencionada anteriormente, necesitarás actualizar tu dependencia de lifecycle:runtime a android.arch.lifecycle:runtime:1.1.1.

Está planificado que Paging alpha7 sea la última versión antes de alcanzar la versión beta.

Cambios en la API

  • Ahora los objetos DataSource.LoadParams tienen un constructor público y los objetos DataSource.LoadCallback son abstractos. De esta manera, se puede unir un DataSource o directamente probar un DataSource con una devolución de llamada de prueba. (b/72600421)
  • Mappers para DataSource y DataSource.Factory
    • map(Function<IN,OUT>) te permite transformar, envolver o decorar los resultados cargados por una DataSource.
    • mapByPage(<List<IN>,List<OUT>>) te permite hacer lo mismo para el procesamiento por lotes (p. ej., si los elementos cargados a partir de SQL necesitan consultar una base de datos por separado, la acción se puede realizar como un lote).
  • Se agregó PagedList#getDataSource() como método de conveniencia. b/72611341
  • Se quitaron de la API todas las clases que dejaron de estar disponibles, incluidas las partes que quedaron del paquete recyclerview.extensions y el LivePagedListProvider.
  • Se cambió DataSource.Factory de una interfaz a una clase abstracta a fin de habilitar la funcionalidad de mapa.

Correcciones de errores

  • Se cambiaron los elementos Builder y ahora son definitivos. b/70848565
  • La implementación de DataSource de Room ahora administra consultas con varias tablas. Esta corrección está incluida en Room 1.1.0-beta1 (consulta más arriba).
  • Se corrigió un error en el que no se invocaba a BoundaryCallback.onItemAtEndLoaded para PositionalDataSource si los marcadores de posición estaban habilitados y el tamaño total era un múltiplo exacto del tamaño de la página.

Versión 1.0.0-alpha5

22 de enero de 2018

Correcciones de errores

  • Se corrigió la carga de la página cuando los marcadores de posición están inhabilitados b/70573345
  • Registro adicional para rastrear errores IllegalArgumentException b/70360195 (y correcciones especulativas de Room)
  • Correcciones de código de muestra de Javadoc b/70411933, b/71467637