Пейджинг

Библиотека Paging Library упрощает постепенную и корректную загрузку данных в RecyclerView вашего приложения.

В этой таблице перечислены все артефакты, входящие в группу androidx.paging .

Артефакт Стабильный релиз Предварительная версия для выпуска Бета-версия Альфа-версия
пейджин-* 3.3.6 3.4.0-rc01 - -
paging-compose 3.3.6 3.4.0-rc01 - -
Последнее обновление этой библиотеки: 14 января 2026 г.

Объявление зависимостей

Чтобы добавить зависимость от Paging, необходимо добавить репозиторий Google Maven в ваш проект. Для получения дополнительной информации ознакомьтесь с информацией в репозитории Google Maven .

Добавьте зависимости для необходимых артефактов в файл build.gradle вашего приложения или модуля:

Круто

dependencies {
  def paging_version = "3.3.6"

  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:3.4.0-rc01"
}

Котлин

dependencies {
  val paging_version = "3.3.6"

  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:3.4.0-rc01")
}

Для получения информации об использовании расширений Kotlin см. документацию ktx .

Для получения дополнительной информации о зависимостях см. раздел «Добавление зависимостей сборки» .

Обратная связь

Ваши отзывы помогают улучшить Jetpack. Сообщите нам, если вы обнаружите новые проблемы или у вас есть идеи по улучшению этой библиотеки. Пожалуйста, ознакомьтесь с существующими проблемами в этой библиотеке, прежде чем создавать новую. Вы можете проголосовать за существующую проблему, нажав кнопку со звездочкой.

Создать новую задачу

Для получения более подробной информации см. документацию по системе отслеживания ошибок .

Версия 3.4

Версия 3.4.0-rc01

14 января 2026 г.

Выпущена androidx.paging:paging-*:3.4.0-rc01 . Версия 3.4.0-rc01 содержит следующие коммиты .

Новые функции

Версия 3.4.0-beta01

17 декабря 2025 г.

Выпущена версия androidx.paging:paging-*:3.4.0-beta01 . Версия 3.4.0-beta01 содержит следующие коммиты .

Исправлены ошибки

  • Исправлена ​​ошибка, приводящая к конфликту состояний между загрузками RecyclerView и Refresh вызывающим IndexOutOfBoundsException в RecyclerView . Прерванные обновления пользовательского интерфейса из-за непрерывных загрузок Refresh могут привести к рассинхронизации состояния постраничной навигации с RecyclerView . Это исправлено путем сброса состояния постраничной навигации до состояния до обновления, если обновление прерывается (т. е. последовательной загрузкой Refresh ). ( I771b0 , b/409809768 )

Версия 3.4.0-alpha04

10 сентября 2025 г.

Выпущена версия androidx.paging:paging-*:3.4.0-alpha04 . Версия 3.4.0-alpha04 содержит следующие коммиты .

Изменения в API

  • Добавлен новый API PagingState closestItemAroundPosition для получения загруженного элемента, наиболее близкого к целевой позиции и соответствующего входному предикату. Это можно использовать для генерации ключей обновления на основе элементов, когда идеальный якорный элемент находится рядом, но не точно в целевой позиции. ( I96e5c , b/440187139 )

Версия 3.4.0-alpha03

27 августа 2025 г.

Выпущена версия androidx.paging:paging-*:3.4.0-alpha03 . Версия 3.4.0-alpha03 содержит следующие коммиты .

Новые функции

  • Paging-common добавил поддержку настольных приложений в качестве новой целевого объекта Kotlin Multiplatform (KMP). В общей сложности теперь он поддерживает JVM (Android и настольные приложения), нативные приложения (Linux, iOS, watchOS, tvOS, macOS, MinGW) и веб-приложения (JavaScript, WasmJS). ( Id2483 , b/436884811 )
  • В Paging-testing добавлены новые целевые платформы Kotlin Multiplatform (KMP). В общей сложности теперь поддерживаются JVM (Android и Desktop), нативные приложения (Linux, iOS, watchOS, tvOS, macOS, MinGW) и веб-приложения (JavaScript, WasmJS). ( I0c543 , b/435014650 )
  • Paging-compose добавил новые цели Kotlin Multiplatform (KMP). В общей сложности теперь он поддерживает JVM (Android и Desktop), нативные приложения (Linux, iOS, watchOS, tvOS, macOS, MinGW) и веб-приложения (JavaScript, WasmJS). ( I70d44 , b/436884801 )

Изменения в API

Версия 3.4.0-alpha02

30 июля 2025 г.

Выпущена версия androidx.paging:paging-*:3.4.0-alpha02 . Версия 3.4.0-alpha02 содержит следующие коммиты .

Изменения в API

  • Теперь PagingData.from позволяет устанавливать placeholdersBefore и placeholdersAfter . Обратите внимание, что прокрутка этих заполнителей не приводит к загрузке страницы. ( I06983 )

Версия 3.4.0-alpha01

2 июля 2025 г.

Выпущена версия androidx.paging:paging-*:3.4.0-alpha01 . Версия 3.4.0-alpha01 содержит следующие коммиты .

Новые функции

Исправлены ошибки

  • В модульных тестах Android, использующих Paging 3.3 или более позднюю версию, PagingLogger больше не будет выдавать ошибок ( Ia9400 , b/331684448 ).
  • Исправлена ​​ошибка, из-за которой RecyclerView выбрасывал IndexOutOfBoundsException при прокрутке пользователем во время обновления RecyclerView ( Id1f16 , b/381024738 ).
  • Исправлена ​​ошибка, из-за которой постраничная навигация не могла запускать дополнительные загрузки при обновлении страницы во время прокрутки. ( I60ca5 , b/352586078 )
  • Исправлена ​​ошибка, приводившая к сбою при прокрутке во время обновления элементов постраничной навигации. ( I8c65a , b/347649763 )

Версия 3.3

Версия 3.3.6

12 февраля 2025 г.

Выпущена androidx.paging:paging-*:3.3.6 . Версия 3.3.6 содержит следующие коммиты .

Исправлены ошибки

  • Сигналы обновления и повторной отправки, отправленные во время первоначального обновления, теперь будут сохраняться и автоматически отправляться повторно, как только презентер пейджинга будет готов.

Внешний вклад

  • Спасибо Еве за отправку исправления ошибки ( #754 )

Версия 3.3.5

11 декабря 2024 г.

Выпущена androidx.paging:paging-*:3.3.5 . Версия 3.3.5 содержит следующие коммиты .

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой RecyclerView выдавал IndexOutOfBoundsException при прокрутке пользователем во время обновления RecyclerView . ( Id1f16 , b/381024738 )

Версия 3.3.4

13 ноября 2024 г.

Выпущена androidx.paging:paging-*:3.3.4 . Версия 3.3.4 содержит следующие коммиты .

Исправлены ошибки

  • В модульных тестах Android, использующих Paging 3.3 или более позднюю версию, больше не будет возникать ошибка типа Method isLoggable in android.util.Log not mocked ( Ia9400 , b/331684448 ).

Версия 3.3.2

7 августа 2024 г.

Выпущена androidx.paging:paging-*:3.3.2 . Версия 3.3.2 содержит следующие коммиты .

Новые функции

  • В paging-common и paging-testing добавлены новые многоплатформенные цели Kotlin: watchos , tvos и linuxArm64 ( 90c9768 ), ( 53e0eca ).

Версия 3.3.1

24 июля 2024 г.

Выпущена androidx.paging:paging-*:3.3.1 . Версия 3.3.1 содержит следующие коммиты .

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой AsyncPagingDataDiffer или построенные на его основе API, такие как PagingDataAdapter используемый с RecyclerView , не могли инициировать повторную загрузку при обновлении источника данных во время прокрутки. ( I60ca5 , b/352586078 )
  • Исправлена ​​ошибка, приводящая к сбою, который происходит при удалении элементов из источника данных во время прокрутки RecyclerView с использованием PagingDataAdapter или AsyncPagingDataDiffer . ( I8c65a , b/347649763 )

Версия 3.3.0

14 мая 2024 г.

Выпущена androidx.paging:paging-*:3.3.0 . Версия 3.3.0 содержит следующие коммиты .

Важные изменения по сравнению с версией 3.2.0

  • Класс PagingDataPresenter теперь является публичным. Теперь на основе PagingDataPresenter можно создавать многоплатформенные презентеры, не требуя внутренних API для работы с пейджингом или AsyncPagingDataDiffer из paging-runtime .
  • Добавлены новые вспомогательные методы LoadStates и CombinedLoadStates в hasError и isIdle для проверки состояния LoadStates — Error или NotLoading соответственно. Также добавлен новый метод расширения Kotlin awaitNotLoading() для Flow<CombinedLoadStates> , который ожидает, пока загрузка не перейдет в состояние NotLoading или Error.
  • Теперь PagingData.empty() по умолчанию отправляет состояния NotLoading , если в его конструктор не переданы пользовательские LoadStates . Это отличается от существующего поведения, когда LoadStates не отправлялись при передаче в PagingDataAdapter или отправлялись состояния Loading при сборе в качестве LazyPagingItems . При сборе в качестве LazyPagingItems теперь также будет отображаться пустой список сразу после первоначального формирования.

Многоплатформенная совместимость Kotlin

Благодаря работе над проектом multiplatform-paging от CashApp, теперь Paging поставляется с артефактами, совместимыми с Kotlin Multiplatform.

  • paging-common все API Paging 3 перенесены в common , и теперь он совместим с JVM и iOS в дополнение к Android.
  • paging-testing перенесен код в common , и теперь он совместим с JVM и iOS в дополнение к Android.
  • paging-compose перенесла свой код в common и включает в себя артефакт для Android, что соответствует многоплатформенной поддержке androidx.compose .
  • paging-runtime , paging-guava , paging-rxjava2 и paging-rxjava3 останутся эксклюзивными для Android.

Версия 3.3.0-rc01

1 мая 2024 г.

Выпущена androidx.paging:paging-*:3.3.0-rc01 без изменений в Paging 3.3.0-beta01. Версия 3.3.0-rc01 содержит следующие коммиты .

Версия 3.3.0-beta01

3 апреля 2024 г.

Выпущена androidx.paging:paging-*:3.3.0-beta01 без существенных изменений. Версия 3.3.0-beta01 содержит следующие коммиты .

Версия 3.3.0-alpha05

20 марта 2024 г.

Выпущена версия androidx.paging:paging-*:3.3.0-alpha05 . Версия 3.3.0-alpha05 содержит следующие коммиты .

Изменения в API

  • Теперь для общего кода в постраничной навигации используется аннотация AndroidX @MainThread . ( I78f0d , b/327682438 )

Версия 3.3.0-alpha04

6 марта 2024 г.

Выпущена версия androidx.paging:paging-*:3.3.0-alpha04 . Версия 3.3.0-alpha04 содержит следующие коммиты .

Исправлены ошибки

  • Исправлены незначительные ошибки в документации, связанные с добавлением многоплатформенной совместимости Kotlin. ( aosp/2950785 )

Версия 3.3.0-alpha03

7 февраля 2024 г.

Выпущена версия androidx.paging:paging-*:3.3.0-alpha03 . Версия 3.3.0-alpha03 содержит следующие коммиты.

Новые функции

  • Класс PagingDataPresenter теперь является публичным. Теперь на основе PagingDataPresenter можно создавать многоплатформенные презентеры, не требуя внутренних API для работы с пейджингом или AsyncPagingDataDiffer из paging-runtime . ( Id1f74 , b/315214786 )
  • Добавлены новые вспомогательные методы LoadStates и CombinedLoadStates для проверки состояния LoadStates : Error или NotLoading . Также добавлен новый API, который ожидает завершения LoadStateFlow до тех пор, пока загрузка не перейдет в состояние NotLoading или Error. ( Id6c67 )

Изменение поведения

  • Теперь PagingData.empty() по умолчанию отправляет состояния NotLoading , если в его конструктор не переданы пользовательские LoadStates . Это отличается от существующего поведения, когда LoadStates не отправлялись при передаче в PagingDataAdapter или отправлялись состояния Loading при сборе в качестве LazyPagingItems . При сборе в качестве LazyPagingItems теперь также будет отображаться пустой список сразу после первоначального формирования. ( I4d11d , b/301833847 )

Версия 3.3.0-alpha02

20 сентября 2023 г.

Выпущена версия androidx.paging:paging-*:3.3.0-alpha02 . Версия 3.3.0-alpha02 содержит следующие коммиты.

Многоплатформенная совместимость Kotlin

Благодаря работе над проектом multiplatform-paging от CashApp, теперь Paging поставляется с артефактами, совместимыми с Kotlin Multiplatform. Это позволит нам избежать расхождений между двумя репозиториями и обеспечить их совместимость.

  • paging-common все API Paging 3 перенесены в common , и теперь он совместим с JVM и iOS в дополнение к Android.
  • paging-testing перенесен код в common , и теперь он совместим с JVM и iOS в дополнение к Android.
  • paging-compose перенесла свой код в common и включает в себя артефакт для Android, что соответствует многоплатформенной поддержке androidx.compose .
  • paging-runtime , paging-guava , paging-rxjava2 и paging-rxjava3 останутся эксклюзивными для Android.

Изменения в API

  • Общедоступный интерфейс Logger, предназначенный только для внутреннего использования, устарел ( I16e95 , b/288623117 ).

Внешний вклад

Версия 3.3.0-alpha01

20 сентября 2023 г.

  • Это первый многоплатформенный релиз библиотек androidx.paging. Эта версия содержит только артефакты *-jvm и *-android . Для macOS, iOS и Linux используйте версию 3.3.0-alpha02 .

Версия 3.2

Версия 3.2.1

6 сентября 2023 г.

Выпущена androidx.paging:paging-*:3.2.1 . Версия 3.2.1 содержит следующие коммиты.

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой API asSnapshot() артефакта Paging Testing зависал при передаче потока, построенного с использованием PagingData.from(List) поскольку asSnapshot() не содержал никакой информации о завершении загрузки (в отличие от перегрузки PagingData.from(List, LoadStates) ). Это обходное решение работает только для завершаемых потоков (например, flowOf(PagingData.from(...)) ). Для незавершаемых потоков (например, MutableStateFlow ) используйте перегрузку PagingData.from , которая предоставляет LoadStates ). ( I502c3 )
  • Теперь в Paging Compose используется внутренний механизм AndroidUiDispatcher.Main , гарантирующий доступность новых данных в том же кадре, что и завершение загрузки. ( Ia55af )

Версия 3.2.0

26 июля 2023 г.

Выпущена androidx.paging:paging-*:3.2.0 . Версия 3.2.0 содержит следующие коммиты.

Важные изменения по сравнению с версией 3.1.0

  • API Paging Compose стабилизировался и был интегрирован обратно в остальную часть Paging, где его версия теперь соответствует всем остальным артефактам Paging. Изменения по сравнению с версией 3.1.0 включают:
    • Поддержка предварительного просмотра списка фиктивных данных путем создания объекта PagingData.from(fakeData) и обертывания этого PagingData в MutableStateFlow (например MutableStateFlow(PagingData.from(listOf(1, 2, 3))) ). Передайте этот поток в составные объекты @Preview в качестве получателя для collectAsLazyPagingItems() для предварительного просмотра.
    • Поддержка всех ленивых макетов, таких как LazyVerticalGrid и HorizontalPager , а также пользовательских ленивых компонентов из библиотек Wear и TV. Это было достигнуто за счет новых методов расширения нижнего уровня LazyPagingItems itemKey и itemContentType , которые позволяют реализовать параметры key и contentType в стандартных API items , уже существующих для LazyColumn , LazyVerticalGrid , а также их эквивалентов в API, таких как HorizontalPager .
    • items(lazyPagingItems) и itemsIndexed(lazyPagingItems) , поддерживающие только LazyListScope , устарели.
  • Новый артефакт paging-testing , предоставляющий API, разработанные для модульного тестирования каждого слоя вашего приложения и его интеграции с системой постраничной навигации в изолированном режиме. Например, он включает в себя:
    • Класс TestPager , позволяющий проверить поведение вашей собственной реализации PagingSource независимо от Pager и реального пользовательского интерфейса.
    • API-интерфейсы asPagingSourceFactory позволяют преобразовывать либо Flow<List<Value>> , либо статический List<Value> в PagingSourceFactory , который можно передать в Pager в тестах.
    • Расширение Kotlin ` asSnapshot для Flow<PagingData<Value>> ` преобразует Flow<PagingData<Value>> непосредственно в ` List<Value> . asSnapshot lambda позволяет имитировать пользовательский интерфейс вашего приложения с помощью таких API, как scrollTo или appendScrollWhile чтобы вы могли проверить корректность снимка данных в любой точке вашего набора постраничных данных.
  • Добавлены стандартные логи для отображения отладочной информации о постраничной навигации на двух уровнях: VERBOSE и DEBUG . Включение логов осуществляется с помощью команды adb shell setprop log.tag.Paging [DEBUG|VERBOSE] . Это относится как к постраничной навигации с использованием представлений, так и к постраничной навигации с использованием Compose.
  • Добавлены конструкторы для PagingDataAdapter и AsyncPagingDataDiffer , которые принимают CoroutineContext вместо CoroutineDispatcher .
  • Добавлен новый функциональный интерфейс PagingSourceFactory , который обеспечивает более явный интерфейс API, чем предыдущие лямбда-функции () -> PagingSource . Эта фабрика может использоваться для создания экземпляра Pager.

Версия 3.2.0-rc01

21 июня 2023 г.

Выпущена androidx.paging:paging-*:3.2.0-rc01 . Версия 3.2.0-rc01 содержит следующие коммиты.

Внешний вклад

  • Спасибо Вейндану за вклад в перенос функции Paging из специфичных для Android/JVM областей. ( #553 , #554 , #555 , #559 )

Версия 3.2.0-beta01

7 июня 2023 г.

Выпущена версия androidx.paging:paging-*:3.2.0-beta01 . Версия 3.2.0-beta01 содержит следующие коммиты.

Пейджингом Создать

  • API Paging Compose официально достиг стабильного состояния. В связи с этим версия была обновлена ​​с 1.0.0-alpha20 и теперь соответствует версии всех остальных компонентов Paging.

Изменения в API

Версия 3.2.0-alpha06

24 мая 2023 г.

Выпущена версия androidx.paging:paging-*:3.2.0-alpha06 . Версия 3.2.0-alpha06 содержит следующие коммиты.

Новые функции

  • Добавлен новый функциональный интерфейс PagingSourceFactory , который обеспечивает более явный интерфейс API, чем существующие лямбда-функции () -> PagingSource . Эта фабрика может использоваться для создания экземпляра Pager . ( I33165 , b/280655188 )
  • Добавлен новый API paging-testing : List<Value>.asPagingSourceFactory() , позволяющий получить PagingSourceFactory , загружающий данные только из неизменяемого списка. Существующее расширение для Flow<List<Value>> следует по-прежнему использовать для тестирования с несколькими поколениями статических данных. ( Id34d1 , b/280655188 )

Изменения в API

  • Теперь все публичные API в paging-testing аннотированы аннотацией @VisibleForTesting , чтобы гарантировать, что эти API используются только в тестах. ( I7db6e )
  • API asSnapshot больше не требует передачи CoroutineScope . Теперь по умолчанию используется контекст, унаследованный от родительской области видимости. ( Id0a78 , b/282240990 )
  • Изменен порядок параметров конструктора TestPager , чтобы он интуитивно соответствовал порядку реальных параметров конструктора Pager ( I6185a ).
  • В paging-testing перенесено использование типа лямбда () -> PagingSource<Key, Value> на тип PagingSourceFactory<Key, Value> . ( I4a950 , b/280655188 )

Изменения в поведении

  • Для запуска тестов постраничной навигации asSnapshot больше не требуется основной диспетчер. Его установка больше не вносит никаких изменений в поведение тестов. ( IE56EA )

Версия 3.2.0-alpha05

3 мая 2023 г.

Выпущена версия androidx.paging:paging-*:3.2.0-alpha05 . Версия 3.2.0-alpha05 содержит следующие коммиты.

Изменения в API

  • API тестирования постраничной навигации asSnapshot теперь по умолчанию устанавливает параметр loadOperations в пустое значение лямбда-функции. Это позволяет вызывать asSnapshot без передачи каких-либо операций загрузки для получения данных из первоначальной загрузки обновления. ( Ied354 , b/277233770 )

Улучшения в документации

  • Внесены изменения в документацию по asPagingSourceFactory() , чтобы уточнить, что это метод расширения для Flow , который возвращает многократно используемую фабрику для генерации экземпляров PagingSource . ( I5ff4f , I705b5 )
  • Обновлена ​​документация по конструктору LoadResult.Page , чтобы уточнить необходимость переопределения itemsBefore и itemsAfter для поддержки перехода. ( Ied354 )

Внешние вклады

Версия 3.2.0-alpha04

8 февраля 2023 г.

Выпущена версия androidx.paging:paging-*:3.2.0-alpha04 . Версия 3.2.0-alpha04 содержит следующие коммиты.

Тестирование пейджинга

  • Артефакт paging-testing теперь содержит метод asPagingSourceFactory для создания pagingSourceFactory из Flow<List<Value>> , который будет передаваться в пейджер. Каждый List<Value>> генерируемый из Flow, представляет собой генерацию данных для пейджинга. Это упрощает тестирование пейджинга, например, для преобразований PagingData , путем имитации источника данных, из которого пейджер будет получать данные. ( I6f230 , b/235528239 )
  • Артефакт paging-testing был расширен новыми API, подходящими для проверки корректности данных, содержащихся в Flow<PagingData<T>> . Это можно использовать, например, для проверки правильности выходных данных Flow<PagingData<T>> из слоя ViewModel.

    Это делается с помощью расширения Kotlin ` asSnapshot для Flow<PagingData<Value>> , которое преобразует Flow<PagingData<Value>> непосредственно в List<Value> . Лямбда-функция asSnapshot позволяет имитировать пользовательский интерфейс вашего приложения с помощью таких API, как scrollTo или appendScrollWhile обеспечивая повторяемость и согласованность, чтобы вы могли в любой момент времени проверять корректность снимка данных в вашем наборе постраничных данных.

    // Create your ViewModel instance
    val viewModel = 
    // Get the Flow of PagingData from the ViewModel
    val data< Flow<PagingData<String>> = viewModel.data
    val snapshot: List<String> = data.asSnapshot {
      // Each operation inside the lambda waits for the data to settle before continuing
      scrollTo(index = 50)
    
      // While you can’t view the items within the asSnapshot call,
      // you can continuously scroll in a direction while some condition is true
      // i.e., in this case until you hit a placeholder item
      appendScrollWhile {  item: String -> item != Header 1 }
    }
    // With the asSnapshot complete, you can now verify that the snapshot
    // has the expected values
    

    asSnapshot — это метод suspend , который, как ожидается, будет выполняться внутри runTest . Дополнительную информацию см. в разделе «Тестирование сопрограмм Kotlin на Android» . ( I55fd2 , I5bd26 , I7ce34 , I51f4d , I2249f , Id6223 , Ic4bab , Ib29b9 , Ic1238 , I96def , b/235528239 )

Изменения в API

  • Теперь вызовы функций getItem и peek в AsyncPagingDataDiffer и PagingDataAdapter корректно помечаются как вызываемые только в основном потоке. ( I699b6 )
  • Удалены подстановочные знаки из обобщенных типов, используемых TestPager , что упрощает обработку результатов этих методов в коде, написанном на языке программирования Java. ( I56c42 )

Версия 3.2.0-alpha03

24 октября 2022 г.

Выпущена версия androidx.paging:paging-*:3.2.0-alpha03 . Версия 3.2.0-alpha03 содержит следующие коммиты.

Тестирование пейджинга

В этом релизе представлен новый артефакт: paging-testing . Этот артефакт предоставляет API, разработанные для модульного тестирования каждого слоя вашего приложения и его интеграции с Paging в изолированном режиме.

Например, в этот первый релиз включен класс TestPager , который позволяет проверять поведение вашей собственной реализации PagingSource независимо от Pager и реального пользовательского интерфейса, которые обычно необходимы для имитации сквозной интеграции Paging.

TestPager следует рассматривать как подделкутестовый двойник , который имитирует реальную реализацию Pager , предоставляя при этом упрощенную поверхность API для тестирования PagingSource . Эти API являются suspend API и должны запускаться в рамках runTest , как описано в руководстве по тестированию сопрограмм Kotlin на Android .

Пример использования этих API можно найти в тестах room-paging , которые были переработаны для использования TestPager .

Изменения в API

  • Обеспечивает удобную итерацию по LoadResult.Page.data с помощью LoadResult.Page.iterator() . Это косвенно позволяет использовать метод flatten из стандартной библиотеки Kotlin при передаче List<LoadResult.Page> , например, со свойством pages объекта PagingState , которое передается методу PagingSource.getRefreshKey . ( IE0718 )

Версия 3.2.0-alpha02

10 августа 2022 г.

Выпущена версия androidx.paging:paging-*:3.2.0-alpha02 . Версия 3.2.0-alpha02 содержит следующие коммиты.

Новые функции

  • Теперь функция Paging предоставляет журналы через классы AsyncPagingDataDiffer или PagingDataAdapter , позволяющие отображать отладочную информацию, собранную из PagingData .
  • Включить ведение журналов можно с помощью команды adb shell : adb shell setprop log.tag.Paging [DEBUG|VERBOSE]. ( b/235527159 )

Исправлены ошибки

  • Исправлена ​​ошибка отсутствия конструктора PagingDataDiffer при использовании paging-common:3.2.0-alpha01 с paging-runtime:3.1.1 или более старыми версиями. ( b/235256201 )

Версия 3.2.0-alpha01

1 июня 2022 г.

Выпущена версия androidx.paging:paging-*:3.2.0-alpha01 . Версия 3.2.0-alpha01 содержит следующие коммиты.

Изменения в API

  • Добавлены конструкторы для PagingDataAdapter и AsyncPagingDataDiffer , которые принимают CoroutineContext вместо CoroutineDispatcher . ( Idc878 )
  • По умолчанию PagingData.from() и PagingData.empty() больше не влияют на CombinedLoadStates на стороне презентера. Добавлена ​​новая перегрузка, позволяющая передавать sourceLoadStates и remoteLoadStates в эти конструкторы, чтобы сохранить существующее поведение установки LoadStates в полностью терминальное состояние (т.е. NotLoading(endOfPaginationReached = false) ), с возможностью включения удаленных состояний при необходимости. Если LoadStates не передаются, то предыдущие значения CombinedLoadStates будут сохранены на стороне презентера при получении статического объекта PagingData . ( Ic3ce5 , b/205344028 )

Исправлены ошибки

  • Результат PagingSource.getRefreshKey() теперь корректно имеет приоритет над initialKey в тех случаях, когда он должен был бы вернуть null, но был установлен ненулевой initialKey . ( Ic9542 , b/230391606 )

Внешний вклад

  • Обновлен API :compose:ui:ui-test (updateApi) в связи с миграцией библиотеки test-coroutines-lib ( I3366d ).

Версия 3.1

Версия 3.1.1

9 марта 2022 г.

Выпущена androidx.paging:paging-*:3.1.1 . Версия 3.1.1 содержит следующие коммиты.

Исправлены ошибки

  • Удалены промежуточные события LoadState.NotLoading между поколениями, которые были некорректно добавлены методом .cachedIn() . Это изменение значительно упрощает реагирование на изменения LoadState , удаляя избыточные события LoadState.NotLoading , которые возникали между повторными попытками загрузки, при обновлении или во время аннулирования.

Версия 3.1.0

17 ноября 2021 г.

Выпущена androidx.paging:paging-*:3.1.0 . Версия 3.1.0 содержит следующие коммиты.

Важные изменения с версии 3.0.0

  • API-интерфейсы Flow<PagingData>.observable и Flow<PagingData>.flowable больше не являются экспериментальными.
  • Изменения в поведении функции LoadState :
    • Теперь endOfPaginationReached всегда false для LoadType.REFRESH как для PagingSource , так и RemoteMediator
    • Теперь LoadStates из Paging ожидают корректных значений от PagingSource и RemoteMediator , прежде чем передавать их дальше. Новые поколения PagingData теперь всегда будут корректно начинаться с состояния Loading для обновления, вместо того чтобы в некоторых случаях некорректно сбрасываться в состояние NotLoading .
    • .loadStateFlow и .addLoadStateListener в API презентера больше не отправляют избыточное начальное значение CombinedLoadStates , в котором состояния посредника всегда установлены в null
  • Теперь аннулирование данных прошлых поколений происходит автоматически при аннулировании/создании новых поколений. Использование .collectLatest для Flow<PagingData> больше не требуется, хотя его по-прежнему рекомендуется использовать.
  • В качестве нового возвращаемого типа для PagingSource.load добавлен PagingSource.LoadResult.Invalid , который заставляет Paging отбрасывать все ожидающие или будущие запросы на загрузку данных в этот PagingSource и аннулировать его. Этот возвращаемый тип предназначен для обработки потенциально некорректных или устаревших данных, которые могут быть возвращены из базы данных или сети.
  • Добавлены API-интерфейсы презентера .onPagesPresented и .addOnPagesUpdatedListener , которые срабатывают синхронно по мере отображения страниц в пользовательском интерфейсе. Обновление страниц может происходить в следующих сценариях:
    • Первоначальная загрузка нового поколения PagingData завершается независимо от того, содержит ли новое поколение какие-либо изменения в отображаемых элементах. То есть, если новое поколение завершает первоначальную загрузку без обновлений, поскольку список остается точно таким же, это все равно вызовет этот обратный вызов.
    • Страница вставляется, даже если вставленная страница не содержит новых элементов.
    • Страница перетаскивается, даже если она была пустой.

Версия 3.1.0-rc01

3 ноября 2021 г.

Выпущена androidx.paging:paging-*:3.1.0-rc01 . Версия 3.1.0-rc01 содержит следующие коммиты.

Исправлены ошибки

  • Исправлена ​​ошибка состояния гонки и утечки памяти в методе .cachedIn() в случаях, когда Paging отправлял несколько событий загрузки нижестоящим потоком, когда не было наблюдателей, или когда наблюдатель переключался на новые данные PagingData. ( Ib682e )

Версия 3.1.0-beta01

13 октября 2021 г.

Выпущена версия androidx.paging:paging-*:3.1.0-beta01 . Версия 3.1.0-beta01 содержит следующие коммиты.

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой многочисленные быстрые обращения к элементам могли приводить к их удалению для учета в параметре prefetchDistance, что вызывало зависание загрузки страницы. Это особенно актуально, когда множество элементов отображаются одновременно в порядке, который отдает приоритет загрузке относительно направления прокрутки пользователя. Теперь обращения к этим элементам буферизуются и синхронно приоритезируются, чтобы предотвратить их удаление. ( aosp/1833273 )

Версия 3.1.0-alpha04

29 сентября 2021 г.

Выпущена версия androidx.paging:paging-*:3.1.0-alpha04 . Версия 3.1.0-alpha04 содержит следующие коммиты.

Изменения в API

  • API-интерфейсы Flow<PagingData>.observable и Flow<PagingData>.flowable больше не являются экспериментальными. ( Ie0bdd )

Исправлены ошибки

  • Для LoadStates endOfPaginationReached теперь всегда равно false для LoadType.REFRESH . Ранее endOfPaginationReached могло быть true для RemoteMediator REFRESH , но не для PagingSource. Теперь это поведение зафиксировано на уровне false , поскольку REFRESH никогда не является завершающим этапом, и теперь это задокументировано как часть контракта API в LoadStates. При принятии решения о завершении пагинации всегда следует учитывать либо направление APPEND, либо направление PREPEND. ( I047b6 )
  • Теперь события LoadStates из Paging ожидают корректных значений как от PagingSource, так и от RemoteMediator, прежде чем передавать их дальше между поколениями. Это предотвращает отправку NotLoading новыми поколениями PagingData в CombinedLoadStates.source.refresh, если оно уже было Loading; новые поколения PagingData теперь всегда будут корректно начинать с Loading для состояния обновления, вместо того чтобы в некоторых случаях сначала некорректно сбрасываться на NotLoading.

    Теперь аннулирование данных прошлых поколений происходит автоматически при аннулировании/создании новых поколений. Использование метода .collectLatest для Flow<PagingData> больше не требуется, хотя его по-прежнему настоятельно рекомендуется использовать. ( I0b2b5 , b/177351336 , b/195028524 )

  • .loadStateFlow и .addLoadStateListener в API презентера больше не отправляют избыточно начальное значение CombinedLoadStates , в котором состояния посредника всегда установлены в null , а состояния источника — в NotLoading(endOfPaginationReached = false) . Это означает, что:

    1. При использовании RemoteMediator состояния посредника всегда будут заполнены.
    2. Регистрация нового слушателя loadState или нового сборщика в .loadStateFlow больше не будет немедленно выдавать текущее значение, если он не получил реального CombinedLoadStates от PagingData . Это может произойти, если сборщик или слушатель запускается до того, как будет отправлен PagingData . ( I1a748 )

Версия 3.1.0-alpha03

21 июля 2021 г.

Выпущена версия androidx.paging:paging-*:3.1.0-alpha03 . Версия 3.1.0-alpha03 содержит следующие коммиты.

Изменения в API

  • В метод PagingSource добавлен третий тип возвращаемого значения LoadResult: LoadResult.Invalid. Если метод PagingSource.load возвращает LoadResult.Invalid, постраничная обработка отбрасывает загруженные данные и делает PagingSource недействительным. Этот тип возвращаемого значения предназначен для обработки потенциально недействительных или устаревших данных, которые могут быть возвращены из базы данных или сети.

    Например, если в базовую базу данных производится запись, но PagingSource не обновляется вовремя, он может возвращать противоречивые результаты, если его реализация зависит от неизменяемости базового набора данных, из которого он загружается (например, реализации баз данных в стиле LIMIT OFFSET). В этом сценарии рекомендуется проверять обновление после загрузки и возвращать LoadResult.Invalid, что заставляет PagingSource отбрасывать все ожидающие или будущие запросы на загрузку к этому PagingSource и обновлять его.

    Этот тип возвращаемого значения также поддерживается API Paging2, использующим LivePagedList или RxPagedList. При использовании PagingSource с API PagedList Paging2, PagedList немедленно отсоединяется, что прекращает дальнейшие попытки загрузки данных в этот PagedList и приводит к аннулированию PagingSource.

    LoadResult — это закрытый класс, что означает, что это изменение несовместимо с исходным кодом, так что в случаях, когда результаты PagingSource.load используются напрямую, обработка LoadResult.Invalid должна происходить во время компиляции. Например, пользователям Kotlin, использующим exhaustive-when для проверки типа возвращаемого значения, придется добавить проверку на недопустимый тип. ( Id6bd3 , b/191806126 , b/192013267 )

Исправлены ошибки

  • Добавленные с помощью PagingSource.registerInvalidatedCallback или DataSource.addInvalidatedCallback обработчики событий аннулирования теперь автоматически срабатывают, если они были зарегистрированы для PagingSource/DataSource, который уже был недействителен. Это устраняет состояние гонки, из-за которого Paging Source отбрасывал сигналы аннулирования и зависал при предоставлении источника, который уже был недействителен во время первоначальной загрузки. Кроме того, обработчики событий аннулирования теперь корректно удаляются после срабатывания, поскольку гарантируется, что они будут вызваны не более одного раза. ( I27e69 )
  • Отправка начального значения-заполнителя (InitialPagedList) из вновь созданного потока PagedList, например, LivePagedListBuilder или RxPagedListBuilder, больше не приведет к очистке ранее загруженных данных.

Версия 3.1.0-alpha02

1 июля 2021 г.

Выпущена версия androidx.paging:paging-*:3.1.0-alpha02 . Версия 3.1.0-alpha02 содержит следующие коммиты.

Новые функции

  • Добавлены API-интерфейсы для обработки событий onPagesPresented и представления потока, которые срабатывают сразу после обновления отображаемых страниц в пользовательском интерфейсе.

    Поскольку эти обновления синхронны с пользовательским интерфейсом, вы можете вызывать методы адаптера, такие как `.snapshot`, `.getItemCount`, чтобы проверить состояние после применения обновления. Обратите внимание, что вызов метода `.snapshot()` был оставлен явным, поскольку его выполнение при каждом обновлении может быть затратным.

    Обновление страницы может происходить в следующих случаях:

    • Первоначальная загрузка нового поколения PagingData завершается независимо от того, содержит ли новое поколение какие-либо изменения в отображаемых элементах. То есть, если новое поколение завершает первоначальную загрузку без обновлений, поскольку список остается точно таким же, это все равно вызовет этот обратный вызов.
    • Страница вставляется, даже если вставленная страница не содержит новых элементов.
    • Страница перетаскивается, даже если она была пустой ( I272c9 , b/189999634 )

Исправлены ошибки

  • При обращении к PagedList.dataSource из начального значения, полученного с помощью LivePagedList или RxPagedList, больше не будет некорректно возникать исключение IllegalStateException ( I96707 ).

Версия 3.1.0-alpha01

2 июня 2021 г.

Выпущена версия androidx.paging:paging-*:3.1.0-alpha01 . Версия 3.1.0-alpha01 содержит следующие коммиты.

Изменения в API

  • Классы, предоставляемые paging-rxjava3 теперь находятся в пакете androidx.paging.rxjava3 , чтобы избежать конфликтов с paging-rxjava2 ( Ifa7f6 ).

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой функция Paging иногда отправляла в RecyclerView события, не выполняющие никаких действий, что могло привести к преждевременному срабатыванию некоторых обработчиков событий. ( Ic507f , b/182510751 )

Внешний вклад

  • Добавлены устаревшие API совместимости PagedList в артефакт rxjava3 ( Id1ce2 , b/182497591 )

Paging Compose Версия 1.0.0

Версия 1.0.0-alpha20

24 мая 2023 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha20 . Версия 1.0.0-alpha20 содержит следующие коммиты.

Новые функции

  • Теперь Paging Compose поддерживает предварительный просмотр списка фиктивных данных путем создания PagingData.from(fakeData) и обертывания этого PagingData в MutableStateFlow (например, MutableStateFlow(PagingData.from(listOf(1, 2, 3))) ). Используя эти данные в качестве входных данных для вашего @Preview , вызовы collectAsLazyPagingItems() будут предоставлять LazyPagingItems с возможностью предварительного просмотра. ( I8a78d , b/194544557 )

Исправлены ошибки

  • Кэшированные данные из pager.flow.cachedIn , собранные в LazyPagingItems , теперь будут доступны сразу после восстановления состояния без необходимости асинхронной сборки. Это означает, что кэшированные данные будут готовы к отображению сразу после первоначального формирования данных после восстановления состояния. ( I97a60 , b/177245496 )

Версия 1.0.0-alpha19

3 мая 2023 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha19 . Версия 1.0.0-alpha19 содержит следующие коммиты.

Поддержка всех ленивых макетов.

Ранее Paging Compose предоставлял пользовательские items и расширения itemsIndexed для LazyListScope , что означало невозможность использования Paging Compose с другими ленивыми макетами, такими как LazyVerticalGrid , HorizontalPager или другими пользовательскими ленивыми компонентами, предоставляемыми библиотеками Wear и TV. Устранение этой негибкости является основным обновлением в этом релизе.

Для поддержки большего количества ленивых макетов нам потребовалось разработать API на другом уровне — вместо предоставления пользовательского API items для каждого ленивого макета, Paging Compose теперь предоставляет методы расширения немного более низкого уровня для LazyPagingItems в itemKey и itemContentType . Эти API ориентированы на помощь в реализации параметров key и contentType в стандартных API items , которые уже существуют для LazyColumn , LazyVerticalGrid , а также их эквивалентов в таких API, как HorizontalPager . ( Ifa13b , Ib04f0 , b/259385813 )

Это означает, что поддержка LazyVerticalGrid будет выглядеть следующим образом:

// This part is unchanged
val lazyPagingItems = pager.collectAsLazyPagingItems()

LazyVerticalGrid(columns = GridCells.Fixed(2)) {
  // Here we use the standard items API
  items(
    count = lazyPagingItems.itemCount,
    // Here we use the new itemKey extension on LazyPagingItems to
    // handle placeholders automatically, ensuring you only need to provide
    // keys for real items
    key = lazyPagingItems.itemKey { it.uniqueId },
    // Similarly, itemContentType lets you set a custom content type for each item
    contentType = lazyPagingItems.itemContentType { "contentType" }
  ) { index ->
    // As the standard items call provides only the index, we get the item
    // directly from our lazyPagingItems
    val item = lazyPagingItems[index]
    PagingItem(item = item)
  }
}

Дополнительные примеры использования этих новых API см. в наших примерах .

Хотя эти изменения и увеличивают длину примеров LazyColumn и LazyRow на несколько строк, мы посчитали, что единообразие во всех ленивых макетах является важным фактором для тех, кто будет использовать Paging Compose в будущем. По этой причине существующие расширения для LazyListScope теперь устарели. ( I0c459 , I92c8f , b/276989796 )

Изменения в API

  • Для упрощения перехода на новые API, функции расширения items и itemsIndexed в LazyListScope теперь поддерживают параметр contentType , что соответствует поддержке в новых API. ( Ib1918 , b/255283378 )

Обновления зависимостей

  • В Compose обновили зависимость с Compose 1.0.5 до Compose 1.2.1. ( Ib1918 , b/255283378 )

Версия 1.0.0-alpha18

8 февраля 2023 г.

Выпущена androidx.paging:paging-compose:1.0.0-alpha18 без изменений. Версия 1.0.0-alpha18 содержит следующие коммиты.

Версия 1.0.0-alpha17

24 октября 2022 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha17 . Версия 1.0.0-alpha17 содержит следующие коммиты.

Новые функции

  • Добавлена ​​поддержка пользовательского CoroutineContext при вызове collectLazyPagingItems . ( I7a574 , b/243182795 , b/233783862 )

Версия 1.0.0-alpha16

10 августа 2022 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha16 . Версия 1.0.0-alpha16 содержит следующие коммиты.

Новые функции

  • Теперь функция постраничной навигации предоставляет журналы через класс LazyPagingItems , позволяющий отображать отладочную информацию, собранную из PagingData.
  • Включить ведение журналов можно с помощью команды adb shell adb shell setprop log.tag.Paging [DEBUG|VERBOSE] . ([b/235527159}(https://issuetracker.google.com/issues/235527159))`

Исправлены ошибки

  • Исправлена ​​ошибка отсутствия конструктора PagingDataDiffer при использовании paging-compose:1.0.0-alpha15 с paging-common:3.1.1 или более старыми версиями. ( b/235256201 , b/239868768 )

Версия 1.0.0-alpha15

1 июня 2022 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha15 . Версия 1.0.0-alpha15 содержит следующие коммиты.

Изменения в API

  • Добавлены конструкторы для PagingDataAdapter и AsyncPagingDataDiffer , которые принимают CoroutineContext вместо CoroutineDispatcher . ( Idc878 )

Исправлены ошибки

  • Теперь LazyPagingItems устанавливает начальное loadState как LoadState.Loading refresh. ( I55043 , b/224855902 )

Версия 1.0.0-alpha14

13 октября 2021 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha14 . Версия 1.0.0-alpha14 содержит следующие коммиты.

Версия 1.0.0-alpha13

29 сентября 2021 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha13 . Версия 1.0.0-alpha13 содержит следующие коммиты.

Изменения в API

  • Функция LazyPagingItems.snapshot() была заменена свойством LazyPagingItems.itemSnapshotList ( Ie2da8 ).
  • Метод LazyPagingItems.getAsState() был удален ( IE65e4 ).

Версия 1.0.0-alpha12

21 июля 2021 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha12 . Версия 1.0.0-alpha12 содержит следующие коммиты.

Изменения в API

  • items(lazyPagingItems) и itemsIndexed(lazyPagingItems) используемые для связи постраничной навигации с LazyColumn/Row , теперь принимают параметр key, позволяющий указать стабильный ключ, представляющий элемент. Подробнее о ключах можно прочитать здесь. ( I7986d )
  • Функция lazyPagingItems.getAsState(index) устарела. Используйте вместо неё lazyPagingItems[index] . ( I086cb , b/187339372 )

Версия 1.0.0-alpha11

30 июня 2021 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha11 . Версия 1.0.0-alpha11 содержит следующие коммиты.

Версия 1.0.0-alpha10

2 июня 2021 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha10 . Версия 1.0.0-alpha10 содержит следующие коммиты.

Версия 1.0.0-alpha09

18 мая 2021 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha09 . Версия 1.0.0-alpha09 содержит следующие коммиты.

Исправлены ошибки

  • Теперь свойства itemCount и itemGetter класса LazyPagingItems являются наблюдаемыми, что позволяет использовать его также с LazyVerticalGrid ( Ie2446 , b/171872064 , b/168285687 ).

Совместимость с Compose

  • androidx.paging:paging-compose:1.0.0-alpha09 совместим только с версией Compose 1.0.0-beta07 и выше.

Версия 1.0.0-alpha08

24 февраля 2021 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha08 . Версия 1.0.0-alpha08 содержит следующие коммиты.

Обновлено для интеграции с Compose 1.0.0-beta01.

Версия 1.0.0-alpha07

10 февраля 2021 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha07 . Версия 1.0.0-alpha07 содержит следующие коммиты.

Обновлено для интеграции с Compose alpha12.

Версия 1.0.0-alpha06

28 января 2021 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha06 . Версия 1.0.0-alpha06 содержит следующие коммиты.

Исправлены ошибки

Обновлено с учетом зависимости от Compose 1.0.0-alpha11.

Версия 1.0.0-alpha05

13 января 2021 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha05 . Версия 1.0.0-alpha05 содержит следующие коммиты.

Обновлено с учетом зависимости от Compose 1.0.0-alpha10.

Версия 1.0.0-alpha04

16 декабря 2020 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha04 . Версия 1.0.0-alpha04 содержит следующие коммиты.

Исправлены ошибки

  • Обновлены вспомогательные свойства CombinedLoadStates.refresh , CombinedLoadStates.prepend , CombinedLoadStates.append , чтобы переход из Loading в NotLoading только после того, как состояния загрузки посредника и источника находились NotLoading , что гарантирует применение удаленного обновления. ( I65619 )

Версия 1.0.0-alpha03

2 декабря 2020 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha03 . Версия 1.0.0-alpha03 содержит следующие коммиты.

  • Обновлено в соответствии с версией Compose 1.0.0-alpha08.

Версия 1.0.0-alpha02

11 ноября 2020 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha02 . Версия 1.0.0-alpha02 содержит следующие коммиты.

Изменения в API

  • Добавлены методы .peek() , .snapshot() , .retry() и .refresh() к объектам LazyPagingItem , которые предоставляют ту же функциональность, что и AsyncPagingDataDiffer / PagingDataAdapter ( Iddfe8 , b/172041660 ).

Версия 1.0.0-alpha01

28 октября 2020 г.

Выпущена версия androidx.paging:paging-compose:1.0.0-alpha01 . Версия 1.0.0-alpha01 содержит следующие коммиты.

Новые функции

Артефакт paging-compose обеспечивает интеграцию между библиотекой Paging Library и Jetpack Compose . Простой пример использования:

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

Версия 3.0.1

Версия 3.0.1

21 июля 2021 г.

Выпущена androidx.paging:paging-*:3.0.1 . Версия 3.0.1 содержит следующие коммиты.

Исправлены ошибки

  • При обращении к PagedList.dataSource из начального значения, полученного с помощью LivePagedList или RxPagedList больше не будет некорректно возникать исключение IllegalStateException ( I96707 ).

Версия 3.0.0

Версия 3.0.0

5 мая 2021 г.

Выпущена androidx.paging:paging-*:3.0.0 . Версия 3.0.0 содержит следующие коммиты.

Основные особенности версии 3.0.0

Большая часть существующего API из Paging 2.xx устарела в пользу новых API Paging 3, что обеспечивает следующие улучшения:

  • Первоклассная поддержка сопрограмм Kotlin и Flow.
  • Поддержка отмены
  • Встроенные сигналы состояния нагрузки и ошибок
  • Функция повторной попытки + обновления
  • Все три подкласса DataSource объединены в единый класс PagingSource.
  • Пользовательские преобразования страниц, включая встроенное для добавления разделителей.
  • Заголовки и нижние колонтитулы состояния загрузки

Версия 3.0.0-rc01

21 апреля 2021 г.

Выпущена androidx.paging:paging-*:3.0.0-rc01 . Версия 3.0.0-rc01 содержит следующие коммиты.

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой функция Paging иногда отправляла в RecyclerView события, не выполняющие никаких действий, что могло привести к преждевременному срабатыванию некоторых обработчиков событий. ( Ic507f , b/182510751 )

Версия 3.0.0-beta03

24 марта 2021 г.

Выпущена версия androidx.paging:paging-*:3.0.0-beta03 . Версия 3.0.0-beta03 содержит следующие коммиты.

Исправлены ошибки

  • Мы переработали обработку заполнителей при перезагрузке списка, чтобы предотвратить неожиданные скачки в RecyclerView. Подробности см. в файле NullPaddedDiffing.md . ( If1490 , b/170027529 , b/177338149 )
  • Различные построители PagedList (старый путь совместимости) больше не вызывают некорректно синхронный вызов DataSource.Factory.create() в основном потоке при вызове .build() . ( b/182798948 )

Версия 3.0.0-beta02

10 марта 2021 г.

Выпущена версия androidx.paging:paging-*:3.0.0-beta02 . Версия 3.0.0-beta02 содержит следующие коммиты.

Изменения в API

  • Расширения Rx3 теперь корректно передают требование @ExperimentalCoroutinesApi Opt-In. Ранее оно помечалось в методе @get , который игнорировался компилятором Kotlin из-за: https://youtrack.jetbrains.com/issue/KT-45227 ( I5733c )

Исправлены ошибки

  • Ввести ограничения на публичное использование экспериментальных API ( I6aa29 , b/174531520 )
  • Исправлена ​​ошибка, из-за которой PagingState всегда был null при вызове удаленного обновления.
  • Исправлена ​​ошибка, из-за которой пустые страницы, возвращаемые PagingSource, могли препятствовать повторной загрузке данных для выполнения prefetchDistance , что приводило к «зависанию» Paging.

Версия 3.0.0-beta01

10 февраля 2021 г.

Выпущена версия androidx.paging:paging-*:3.0.0-beta01 . Версия 3.0.0-beta01 содержит следующие коммиты.

Изменения в API

  • Теперь обертки Rx2 и Rx3 предоставляют доступ к экспериментальной аннотации, от которой они зависят. Если вы используете совместимые с Rx обертки в paging-rxjava2 или paging-rxjava3, вам теперь потребуется аннотировать их использование с помощью @OptIn(ExperimentalCoroutinesApi::class) ( Ib1f9d )

Исправлены ошибки

  • Исправлена ​​ошибка IndexOutOfBoundsException: Inconsistency detected при использовании API DataSource версии 2 через пути совместимости.
  • Теперь вызов isInvalid во время инициализации DataSource при использовании путей совместимости корректно запускается в fetchDispatcher, а не в основном потоке. Это исправляет исключение IllegalStateException , возникающее из-за доступа к базе данных в основном потоке при использовании реализации PagingSource из Room.

Версия 3.0.0-alpha13

27 января 2021 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha13 . Версия 3.0.0-alpha13 содержит следующие коммиты.

Изменения в API

  • PagingSource.getRefreshKey больше не является необязательной для реализации, теперь это абстрактная функция без реализации по умолчанию. Пользователи, переходящие на новую платформу, могут либо продолжать возвращать реализацию по умолчанию, которая просто возвращает null , либо getRefreshKey() должна иметь реальную реализацию, возвращающую клавишу на основе текущей позиции прокрутки пользователя, которая позволит Paging продолжать загрузку, центрированную вокруг области просмотра, с помощью PagingState.anchorPosition , если это возможно. ( I4339a )
  • Класс InvalidatingPagingSourceFactory теперь является финальным ( Ia3b0a ).
  • Позволяет настраивать поведение разделителя в конце строки (заголовок/нижний колонтитул) с помощью дополнительного необязательного параметра SeparatorType. Доступны два варианта:
    • FULLY_COMPLETE — существующее поведение; дождитесь, пока PagingSource и RemoteMediator отметят endOfPaginationReached, прежде чем добавлять разделители разделов. Если RemoteMediator не используется, удаленное состояние загрузки игнорируется. Это в первую очередь полезно, если вы хотите отображать разделители разделов только тогда, когда раздел полностью загружен, включая получение данных из удаленного источника, например, сети.
    • SOURCE_COMPLETE — ожидание завершения PagingSource только в том случае, если используется RemoteMediator. Это позволяет отображать заголовки и нижние колонтитулы синхронно с первоначальной загрузкой, что избавляет пользователей от необходимости прокручивать страницу для просмотра разделителей в конце строк. ( Ibe993 , b/174700218 )

Исправлены ошибки

  • Исправлена ​​редкая утечка памяти, которая возникает, когда PagingSource становится недействительным до того, как PageFetcher сможет начать загрузку данных из него. ( I9606b , b/174625633 )

Версия 3.0.0-alpha12

13 января 2021 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha12 . Версия 3.0.0-alpha12 содержит следующие коммиты.

Изменения в API

  • Класс InvalidatingPagingSourceFactory больше не является абстрактным, поскольку у него никогда не было абстрактных методов. ( I4a8c4 )
  • Добавлена ​​перегрузка метода `.cachedIn()`, которая принимает `ViewModel` вместо `Lifecycle` или `CoroutineScope` для пользователей Java. ( I97d81 , b/175332619 )
  • Разрешите Java-вызывающим сторонам использовать операции преобразования PagingData асинхронно, принимая Executor в качестве аргументов оператора преобразования. Все операторы преобразования с префиксом -Sync теперь лишены этого префикса, и пользователям Kotlin Coroutine потребуется уточнять это, вызывая функцию расширения, которая принимает вместо этого блок приостановки. Все операторы преобразования PagingData перемещены в расширения в статическом классе PagingDataTransforms. Пользователям Java потребуется вызывать их через статические вспомогательные функции, например, PagingDataTransforms.map(pagingData, transform) Для пользователей Kotlin синтаксис тот же, но вам потребуется импортировать функцию. ( If6885 , b/172895919 )

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой RemoteMediator.load() не вызывался во время adapter.refresh() , если пагинация уже завершилась.

Версия 3.0.0-alpha11

16 декабря 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha11 . Версия 3.0.0-alpha11 содержит следующие коммиты.

Новые функции

  • Добавлена ​​поддержка сохранения состояния для следующих основных сценариев использования (полная поддержка, особенно в случае многоуровневого источника, все еще находится в стадии разработки):
    • Поток данных кэшируется, и приложение не завершает работу (например, поток данных кэшируется в модели представления, и активность воссоздается в процессе).
    • Источник постраничной навигации учитывается, заполнители включены, и расположение элементов не является ступенчатым.

Изменения в API

  • PagingSource.getRefreshKey() теперь имеет стабильный API ( I22f6f , b/173530980 ).
  • PagingSource.invalidate больше не является открытой функцией. Если вам необходимо получать уведомления о случаях аннулирования, рассмотрите возможность вызова метода registerInvalidatedCallback вместо переопределения метода invalidate. ( I628d9 , b/173029013 , b/137971356 )
  • Теперь Pager имеет один экспериментальный конструктор наряду с обычными конструкторами, вместо того чтобы передавать экспериментальные API в неэкспериментальный публичный API через аннотацию opt-in. ( I9dc61 , b/174531520 )
  • Обновлены вспомогательные свойства CombinedLoadStates.refresh , CombinedLoadStates.prepend , CombinedLoadStates.append , чтобы переход из Loading в NotLoading только после того, как состояния загрузки посредника и источника находились NotLoading , что гарантирует применение удаленного обновления. ( I65619 )
  • Метод LoadParams.pageSize был удалён (он уже был признан устаревшим). Рекомендуется использовать LoadParams.loadSize в вашем PagingSource.

    LoadParams.loadSize всегда равен PagingConfig.pageSize за исключением вызова начальной загрузки, где он равен PagingConfig.initialLoadSize .

    Если вы тестируете свой Paging2 DataSource без использования Pager или PagedList, pageSize может не совпадать с PagingConfig.pageSize , если вы также устанавливаете initialLoadSize . Если это важно для ваших тестов, попробуйте использовать Pager/PagedList, который автоматически установит правильный PageSize для методов загрузки вашего DataSource. ( I98ac7 , b/149157296 )

Исправлены ошибки

  • Исправлена ​​ошибка, приводившая к сбою из-за IllegalStateException при использовании разделителей с установленным параметром PagingConfig.maxSize. ( I0ed33 , b/174787528 )
  • Исправлена ​​ошибка, из-за которой состояние загрузки для PREPEND / APPEND не обновлялось до NotLoading(endOfPaginationReached = true) сразу после первоначальной загрузки, если был установлен RemoteMediator ( I8cf5a ).
  • Исправлена ​​ошибка, из-за которой API-функции на стороне презентера, такие как `.snapshot()`, `.peek()` и т. д., возвращали предыдущий (устаревший) список в обновлениях ListUpdateCallback.
  • Исправлена ​​ошибка, из-за которой операторы Separators не добавляли верхние и нижние колонтитулы при использовании с RemoteMediator.
  • Исправлена ​​ошибка, из-за которой обновление состояния загрузки (Loading) для RemoteMediator приводило к зависанию в состоянии загрузки (Loading).
  • Исправлена ​​ошибка, из-за которой API совместимости Paging2.0, .asPagingSourceFactory() , мог приводить к инициализации базового DataSource в некорректном CoroutineDispatcher. Это устраняет сбой и возможные случаи ANR, особенно при использовании текущей реализации PagingSource в Room, которая использует этот путь совместимости.

Версия 3.0.0-alpha10

2 декабря 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha10 . Версия 3.0.0-alpha10 содержит следующие коммиты.

Изменения в API

  • Устаревшие API-интерфейсы dataRefreshFlow и dataRefreshListener были удалены, поскольку они дублируют функции loadStateFlow / Listener. Для тех, кто переходит на новую версию, эквивалентом для loadStateFlow является:

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

    ( Ib5570 , b/173530908 )

Исправлены ошибки

  • Событие endOfPaginationReached для RemoteMediator REFRESH теперь корректно передается обновлениям LoadState и предотвращает срабатывание удаленных APPEND и PREPEND . ( I94a3f , b/155290248 )
  • Отображение пустого списка, будь то из-за пустой начальной страницы или интенсивной фильтрации, больше не будет препятствовать запуску загрузки PREPEND или APPEND при постраничной навигации. ( I3e702 , b/168169730 )
  • Исправлена ​​ошибка, из-за которой getRefreshKey не вызывался для последующих поколений PagingSource при быстром возникновении аннулирования ключей. ( I45460 , b/170027530 )

Внешний вклад

  • Добавлен новый абстрактный класс InvalidatingPagingSourceFactory с API-функцией .invalidate() , которая перенаправляет вызов invalidate всем генерируемым им объектам PagingSource. Спасибо @claraf3 ! ( Ie71fc , b/160716447 )

Известные проблемы

  • При использовании RemoteMediator b/172254056 верхние и нижние колонтитулы, полученные с помощью преобразования .insertSeparators(), могут отображаться не сразу.
  • Использование RemoteMediator может привести к зависанию удаленного LoadState , если аннулирование и PagingSource.load(LoadParams.Refresh(...)) завершатся до того, как RemoteMediator.load() вернет результат b/173717820

Версия 3.0.0-alpha09

11 ноября 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha09 . Версия 3.0.0-alpha09 содержит следующие коммиты.

Изменения в API

  • Методы dataRefreshFlow / Listener с оператором replaceWith полностью объявлены устаревшими. ( I6e2dd )

Исправлены ошибки

  • Исправлена ​​ошибка IllegalArgumentException , возникающая при использовании разделителей с RemoteMediator и при запуске invalidate во время выполнения удаленной загрузки, которая должна была бы вернуть endOfPagination ( I3a260 ).

Версия 3.0.0-alpha08

28 октября 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha08 . Версия 3.0.0-alpha08 содержит следующие коммиты.

Изменения в API

  • Варианты DataSource.InvalidatedCallback для Kotlin и Java были объединены путем включения SAM-преобразований в Kotlin через функциональный интерфейс (доступен в Kotlin 1.4). Это также исправляет ошибку, из-за которой вариант коллбэков invalidate для Kotlin не вызывался после преобразования с помощью .map или .mapByPage . ( I1f244 , b/165313046 )

Исправлены ошибки

  • Взаимодействие Paging с ViewPager значительно улучшено. В частности, Paging больше не будет отменять вызов RemoteMediator#load из-за недействительности страницы. Он также больше не будет отправлять запрос на добавление/вставку страницы, если требуется REFRESH , до тех пор, пока запрос REFRESH не завершится успешно. ( I6390b , b/162252536 )
  • Проверка API-линтера для MissingGetterMatchingBuilder включена для androidx ( I4bbea , b/138602561 )
  • Исправлена ​​ошибка, из-за которой вспомогательные функции ConcatAdapter с помощью .withLoadState* приводили к сбою из-за уведомления RecyclerView из фонового потока ( I18bb5 , b/170988309 ).
  • Исправлена ​​ошибка, из-за которой загрузка очень маленькой непустой страницы иногда препятствовала корректному запуску предварительной загрузки. Iffda3 b/169259468

Версия 3.0.0-alpha07

1 октября 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha07 . Версия 3.0.0-alpha07 содержит следующие коммиты.

Изменения в API

  • Асинхронные операторы PagingData на основе Guava теперь принимают Executor в качестве параметра для управления контекстом выполнения. ( Id4372 )

Исправлены ошибки

  • Исправлено исключение IndexOutOfBounds, возникающее в RemoteMediator из-за состояния гонки. ( I00b7f , b/165821814 )
  • Исправлена ​​ошибка состояния гонки при преобразовании DataSource в PagingSource, из-за которой результирующий PagingSource мог игнорировать сигналы недействительности от DataSource.
  • Исправлена ​​ошибка в логике загрузки страниц, из-за которой иногда не удавалось получить новые поколения PagingSource до тех пор, пока не был вызван метод PagingDataAdapter.refresh().
  • Исправлена ​​ошибка, из-за которой при использовании DataSource, преобразованного в PagingSource (например, создаваемого Room), в сочетании с RemoteMediator иногда терялась позиция прокрутки.

Внешний вклад

  • Спасибо @simonschiller за добавление операторов асинхронного преобразования на основе RxJava2, RxJava3 и Guava для PagingData!

Версия 3.0.0-alpha06

2 сентября 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha06 . Версия 3.0.0-alpha06 содержит следующие коммиты.

Изменения в API

  • Теперь при вызове PagingDataAdapter.setHasStableIds выбрасывается UnsupportedOperationException с более понятным сообщением об отсутствии поддержки стабильных идентификаторов. ( Ib3890 , b/158801427 )

Исправлены ошибки

  • Функция insertSeparators больше не отфильтровывает пустые страницы, что позволяет презентеру соблюдать расстояние предварительной загрузки даже в случаях, когда вставляется много пустых страниц. ( I9cff6 , b/162538908 )

Версия 3.0.0-alpha05

19 августа 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha05 . Версия 3.0.0-alpha05 содержит следующие коммиты.

Исправлены ошибки

  • Теперь постраничная навигация корректно загружает страницы даже при сильной фильтрации представленных данных.
  • Возврат значения LoadResult.Error при повторной попытке загрузки больше не приводит к некорректному повторному запуску попыток доступа к элементам.

Внешний вклад

  • Спасибо Кларе Ф. за помощь в очистке некоторых тестов! ( 549612 )

Версия 3.0.0-alpha04

5 августа 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha04 . Версия 3.0.0-alpha04 содержит следующие коммиты.

Изменения в API

  • Добавлен API peek() в AsyncPagingDataDiffer и PagingDataAdapter , позволяющий получать доступ к отображаемым данным без запуска загрузки страницы. ( I38898 , b/159104197 )
  • Добавлен API snapshot() в PagingDataAdapter и AsyncPagingDataDiffer , позволяющий получать отображаемые элементы без запуска загрузки страницы. ( I566b6 , b/159104197 )
  • Добавлен конструктор PagingData.from(List<T>) , позволяющий отображать статические списки, который можно комбинировать с общим потоком PagingData для отображения статических списков в определенных состояниях, например, до завершения первоначального обновления или просто для тестирования преобразований. ( Id134d )
  • API-интерфейсы dataRefresh/Listener следует считать устаревшими, поскольку они предназначались для отображения состояния отображаемых элементов при обновлении, но с улучшением синхронизации обратных вызовов loadState/Listener и свойства itemCount они стали избыточными ( Ia19f3 ).
  • Добавлены обертки совместимости с RxJava3 для PagingSource и RemoteMediator ( I49ef3 , b/161480176 )

Исправлены ошибки

  • PositionalDataSource , преобразованный в PagingSource с помощью вспомогательной функции toPagingSourceFactory , теперь корректно помечает PagingSource , сгенерированный Room, для поддержки перехода между страницами. ( I3e84c , b/162161201 )
  • Исправлена ​​ошибка, из-за которой использование синхронного варианта submitData иногда приводило к состоянию гонки, вызывающему исключение ClosedSendChannelException ( I4d702 , b/160192222 ).

Внешний вклад

  • Спасибо Заку Свирсу за добавление оберток, совместимых с RxJava3, от имени Slack! ( I49ef3 , b/161480176 )

Версия 3.0.0-alpha03

22 июля 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha03 . Версия 3.0.0-alpha03 содержит следующие коммиты.

Изменения в API

  • Конструктор класса PagingState теперь является публичным, что должно упростить тестирование реализаций метода getRefreshKey() ( I8bf15 ).
  • Скрыть варианты функции map в Kotlin для DataSource из Java, чтобы разрешить неоднозначность между оригинальным и Kotlin-вариантами. ( If7b23 , b/161150011 )
  • Избыточные API, предназначенные для удобства пользователей Kotlin, помечены как @JvmSynthetic ( I56ae5 ).
  • Добавлены перегрузки для конструктора LoadResult.Page, которые по умолчанию устанавливают значения itemsBefore и itemsAfter равными COUNT_UNDEFINED ( I47849 ).
  • Внесены изменения в существующие операторы PagingData, позволяющие использовать методы с приостановкой обработки, а также добавлены новые операторы mapSync, flatMapSync и filterSync, не требующие приостановки обработки, для пользователей Java. Существующие методы преобразования перенесены в функции расширения, поэтому пользователям Kotlin теперь потребуется их импортировать. ( I34239 , b/159983232 )

Исправлены ошибки

  • Теперь в элементах Room (и PositionalDataSource) PagingSources будет отображаться разделитель в начале первой страницы, поэтому пользователю не нужно будет прокручивать страницу, чтобы его увидеть. ( I6f747 , b/160257628 )
  • Теперь при обращении к элементам-заполнителям корректно запускается загрузка PagingSource до тех пор, пока не будет возвращена страница, соответствующая запрошенному индексу после преобразования с помощью PagingData.filter() ( I95625 , b/158763195 ).
  • Исправлена ​​ошибка, из-за которой прокрутка после того, как PagingSource возвращает ошибку, иногда могла препятствовать повторной попытке вызова PagingDataAdapter.retry(). ( I1084f , b/160194384 )
  • Исправлена ​​ошибка, из-за которой при перетаскивании страницы страницы при доступе к элементам могли не загружаться, даже если доступ к элементам находился в пределах prefetchDistance ( Ie95ae , b/160038730 ).
  • Установка параметра PagingConfig.maxSize больше не включает плейсхолдеры после события удаления ( I2be29 , b/159667766 ).

Версия 3.0.0-alpha02

24 июня 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha02 . Версия 3.0.0-alpha02 содержит следующие коммиты.

Изменения в API

  • Добавлены перегрузки для конструктора PagingConfig с общими значениями по умолчанию ( I39c50 , b/158576040 )
  • Добавлены перегрузки для конструкторов PagingDataAdapter и AsyncPagingDataDiffer с общими значениями по умолчанию ( Ie91f5 ).
  • Теперь API-интерфейсы адаптера, dataRefreshFlow и dataRefreshListener передают логическое значение, указывающее на то, пуст ли PagingData ( I6e37e , b/159054196 ).
  • Добавлены API RxJava и Guava для RemoteMediator — RxRemoteMediator и ListenableFutureRemoteMediator.
  • Добавлены вспомогательные функции в PagingState для доступа к элементам, например, isEmpty() и firstItemOrNull() ( I3b5b6 , b/158892717 )

Исправлены ошибки

  • Теперь Pager проверяет повторное использование PagingSource в фабрике, чтобы предотвратить случайное повторное использование недействительных PagingSource, что приводило к неясной ошибке ( I99809 , b/158486430 ).
  • Сбои при обновлении RemoteMediator больше не препятствуют загрузке PagingSource ( I38b1b , b/158892717 ).
  • Неприостанавливаемая версия submitData больше не вызывает сбой из-за одновременной сборки мусора на нескольких PagingData при вызове после приостанавливаемой версии submitData . ( I26358 , b/158048877 )
  • Исправлена ​​ошибка "невозможно дважды получить данные с пейджера", которая могла возникнуть после изменения конфигурации ( I58bcc , b/158784811 ).

Версия 3.0.0-alpha01

10 июня 2020 г.

Выпущена версия androidx.paging:paging-*:3.0.0-alpha01 . Версия 3.0.0-alpha01 содержит следующие коммиты.

Библиотека пейджинга обновлена ​​до версии 3.0, что позволило внедрить ряд важных новых функций.

Новые возможности версии 3.0

Известные проблемы

  • Документация Javadoc для Paging 3 пока недоступна. Временно используйте руководства, ссылки на которые приведены выше, или документацию Kotlin. ( b/158614050 )

Версия 2.1.2

Версия 2.1.2

18 марта 2020 г.

Выпущена версия androidx.paging:paging:2.1.2 . Версия 2.1.2 содержит следующие изменения по сравнению с версией 2.1.0 .

Исправлены ошибки

  • Исправлена ​​ошибка IndexOutOfBoundsException возникающая в редких случаях при преобразовании позиции во время аннулирования.

Проблема с выпуском

  • Версия Paging 2.1.1 была выпущена некорректно из неправильно настроенной ветки, что привело к частичному раскрытию API и функциональности, которые появятся в будущих релизах.

  • В Paging 2.1.2 содержится исправление центрирования нагрузки, первоначально выпущенное в версии 2.1.1, но на этот раз корректно перенесенное поверх релиза 2.1.0. Настоятельно рекомендуется обновиться до этой версии, если вы в настоящее время используете 2.1.1.

Версия 2.1.1

Версия 2.1.1

18 декабря 2019 г.

Выпущена androidx.paging:paging-*:2.1.1 . Версия 2.1.1 содержит следующие коммиты .

Исправлены ошибки

  • Теперь первоначальная загрузка данных из PositionalDataSources осуществляется последовательно относительно последнего доступа, когда плейсхолдеры отключены.

Версия 2.1.0

Версия 2.1.0

25 января 2019 г.

Выпущена версия Paging 2.1.0 без изменений по сравнению с 2.1.0-rc01 .

Версия 2.1.0-rc01

6 декабря 2018 г.

Выпущена версия Paging 2.1.0-rc01 без изменений по сравнению с 2.1.0-beta01 .

Версия 2.1.0-beta01

1 ноября 2018 г.

Выпущена версия Paging 2.1.0-beta01 без изменений по сравнению с 2.1.0-alpha01 .

Версия 2.1.0-alpha01

12 октября 2018 г.

В версии Paging 2.1.0-alpha01 внесены два важных нововведения — перетаскивание страниц и добавлены библиотеки расширений KTX для каждого артефакта, а также внесены ряд других изменений в API и исправлены ошибки.

Изменения в API

  • Добавлена PagedList.Config.Builder.setMaxSize() для ограничения количества загружаемых элементов в память.
  • Добавлена androidx.paging.Config() в качестве альтернативы PagedList.Config.Builder на Kotlin.
  • Добавлена androidx.paging.PagedList() в качестве альтернативы PagedList.Builder на Kotlin.
  • Добавлен DataSourceFactory.toLiveData() в качестве альтернативы LivePagedListBuilder на Kotlin.
  • Добавлены DataSourceFactory.toObservable() и toFlowable() в качестве альтернатив Kotlin для RxPagedListBuilder
  • Добавлена AsyncPagedListDiffer.addPagedListListener() для отслеживания событий при перестановке элементов в PagedList. b/111698609
  • Добавлен вариант метода PagedListAdapter.onCurrentListChanged() , передающий старый и новый списки; предыдущий вариант устарел.
  • Добавлены варианты PagedListAdapter/AsyncPagedListDiffer.submitList() , которые принимают дополнительную функцию обратного вызова, срабатывающую, если/когда список страниц отображается после сравнения изменений. Это позволяет синхронизировать замену списка страниц с другими обновлениями пользовательского интерфейса. b/73781068
  • Добавлена PagedList.getLoadedCount() , позволяющая узнать, сколько элементов находится в памяти. Обратите внимание, что возвращаемое значение всегда равно .size() если заполнители отключены.

Исправлены ошибки

  • Исправлена ​​ошибка состояния гонки при сравнении изменений, если списки используются повторно b/111591017
  • Теперь PagedList.loadAround() выбрасывает IndexOutOfBoundsException если индекс недействителен. Ранее он мог завершиться с ошибкой, связанной с другим неясным исключением.
  • Исправлена ​​ошибка, из-за которой крайне малый начальный размер загрузки в сочетании с неизмененными данными приводил к невозможности дальнейшей загрузки b/113122599

Версия 2.0.0

Версия 2.0.0

1 октября 2018 г.

Выпущена версия Paging 2.0.0 с одним исправлением ошибки.

Исправлены ошибки

  • Исправлена ​​ошибка, приводившая к сбою, который мог произойти при очень быстрой прокрутке с использованием PositionalDataSource и заполнителей b/114635383 .

Версия 2.0.0-beta01

2 июля 2018 г.

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой контент исчезал в некоторых случаях добавления элементов в начало списка (заполнители отключены, PositionalDataSource) b/80149146
  • (Уже выпущено в 1.0.1 ) Исправлены ошибки, из-за которых PagedListAdapter и AsyncPagedListDiffer не могли сигнализировать о событиях перемещения. b/110711937

Зависимости, предшествующие AndroidX

Для последующих версий Paging, предшествующих AndroidX, необходимо добавить следующие зависимости:

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"
}

Версия 1.0.1

Версия 1.0.1

26 июня 2018 г.

Выпущена версия Paging 1.0.1 с одним исправлением ошибки во runtime . Мы настоятельно рекомендуем использовать 1.0.1 для обеспечения стабильности. Также выпущена версия Paging RxJava2 1.0.1 , идентичная версии 1.0.0-rc1 .

Исправлены ошибки

  • Исправлены ошибки, приводившие к сбоям, из-за которых PagedListAdapter и AsyncPagedListDiffer не могли сигнализировать о событиях перемещения. b/110711937

RxJava2 Версия 1.0.0

RxJava2 Версия 1.0.0-rc1

16 мая 2018 г.

Обновление RxJava2 1.0.0-rc1 переходит в стадию релиз-кандидата без изменений по сравнению с первоначальной альфа-версией.

Версия 1.0.0

Версия 1.0.0-rc1

19 апреля 2018 г. Предварительная версия объявления о выпуске системы пейджинга

В релизе Paging 1.0.0 больше нет известных проблем или новых функций. Пожалуйста, обновите свои проекты до версии 1.0.0-rc1 и помогите нам протестировать её, чтобы мы могли выпустить абсолютно стабильную версию 1.0.0 .

В этом релизе нет изменений, он идентичен версии 1.0.0-beta1 .

Версия 1.0.0-beta1

5 апреля 2018 г.

Функция пейджинга будет находиться в бета-версии в течение короткого времени, после чего перейдет к выпуску в качестве кандидата. Мы не планируем дальнейших изменений API для Paging 1.0 , и планка для любых изменений API очень высока.

Поддержка постраничной навигации в Alpha RxJava2 выпущена как отдельный необязательный модуль ( android.arch.paging:rxjava2:1.0.0-alpha1 ) и будет временно выпускаться отдельно по версии до стабилизации.

Эта новая библиотека предоставляет альтернативу LivePagedListBuilder для RxJava2, способную создавать Observable и Flowable , принимая Scheduler вместо Executor :

Котлин

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

Java

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

Новые функции

  • RxPagedListBuilder добавлен с помощью нового артефакта android.arch.paging:rxjava2 .

Изменения в API

  • Изменения в API для уточнения роли исполнителей в сборщиках:

    • setBackgroundThreadExecutor() переименована в setFetchExecutor()PagedList.Builder и LivePagedListBuilder ).

    • setMainThreadExecutor() переименована в setNotifyExecutor()PagedList.Builder ).

  • Исправлена ​​ошибка, из-за которой член PagedList.mCallbacks стал приватным.

Исправлены ошибки

  • LivePagedListBuilder запускает первоначальную загрузку PagedList на указанном исполнителе, а не в пуле потоков ввода-вывода компонентов Arch.

  • Исправлено поведение invalidate во внутренних обертках DataSource (используемых для реализации DataSource.map , а также для загрузки PositionalDataSource с отключенным плейсхолдером) b/77237534

Версия 1.0.0-alpha7

21 марта 2018 г.

Paging 1.0.0-alpha7 is released alongside Lifecycles 1.1.1 . As Paging alpha7 depends on the move of the Function class mentioned above, you will need to update your lifecycle:runtime dependency to android.arch.lifecycle:runtime:1.1.1 .

Paging alpha7 is planned to be the final release before Paging hits beta.

Изменения в API

  • DataSource.LoadParams objects now have a public constructor and DataSource.LoadCallback objects are now abstract. This enables wrapping a DataSource or directly testing a DataSource with a mock callback. b/72600421
  • Mappers for DataSource and DataSource.Factory
    • map(Function<IN,OUT>) allows you to transform, wrap, or decorate results loaded by a DataSource .
    • mapByPage(<List<IN>,List<OUT>>) enables the same for batch processing (eg if items loaded from SQL need to additionally query a separate database, that can be done as a batch.)
  • PagedList#getDataSource() is added as a convenience method b/72611341
  • All deprecated classes have been removed from the API, including the remains of recyclerview.extensions package, and the LivePagedListProvider .
  • DataSource.Factory is changed from an interface to an abstract class to enable map functionality.

Исправлены ошибки

  • Changed Builders to be final. b/70848565
  • Room DataSource implementation is now fixed to handle multi-table queries - this fix is contained within Room 1.1.0-beta1, see above.
  • Fixed a bug where BoundaryCallback.onItemAtEndLoaded would not be invoked for PositionalDataSource if placeholders are enabled and the total size is an exact multiple of the page size.

Version 1.0.0-alpha5

January 22, 2018

Исправлены ошибки

  • Fix page loading when placeholders are disabled b/70573345
  • Additional logging for tracking down IllegalArgumentException bug b/70360195 (and speculative Room-side fix)
  • Javadoc sample code fixes b/70411933 , b/71467637