Paging

Biblioteka Paging ułatwia stopniowe i płynne wczytywanie danych w RecyclerView aplikacji.

Ta tabela zawiera listę wszystkich artefaktów w grupie androidx.paging.

Artefakt Wersja stabilna Wersja kandydująca do publikacji Wersja beta Wersja alfa
paging-* 3.4.2 - 3.5.0-beta01 -
paging-compose 3.4.2 - 3.5.0-beta01 -
Ostatnia aktualizacja tej biblioteki: 8 kwietnia 2026 r.

Deklarowanie zależności

Aby dodać zależność od biblioteki Paging, musisz dodać do projektu repozytorium Maven Google. Więcej informacji znajdziesz w artykule Repozytorium Maven Google.

Dodaj zależności dotyczące potrzebnych artefaktów w pliku build.gradle aplikacji lub modułu:

Groovy

dependencies {
  def paging_version = "3.4.2"

  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.5.0-beta01"
}

Kotlin

dependencies {
  val paging_version = "3.4.2"

  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.5.0-beta01")
}

Informacje o korzystaniu z rozszerzeń Kotlin znajdziesz w dokumentacji ktx.

Więcej informacji o zależnościach znajdziesz w artykule Dodawanie zależności kompilacji.

Opinia

Twoja opinia pomoże nam ulepszyć Jetpacka. Jeśli odkryjesz nowe problemy lub masz pomysły na ulepszenie tej biblioteki, daj nam znać. Zanim utworzysz nowy problem, zapoznaj się z dotychczasowymi problemami w tej bibliotece. Możesz oddać głos na istniejący problem, klikając przycisk gwiazdki.

Tworzenie nowego problemu

Więcej informacji znajdziesz w dokumentacji narzędzia Issue Tracker.

Wersja 3.5

Wersja 3.5.0-beta01

8 kwietnia 2026 r.

Publikacja androidx.paging:paging-*:3.5.0-beta01 Wersja 3.5.0-beta01 zawiera te zmiany.

Zmiany w interfejsie API

  • Interfejs Flow<PagingData>.asState API został zmieniony na Flow<PagingData>.asItemSnapshotListFlow (I0dc11, b/496548025).

Wersja 3.5.0-alpha01

11 marca 2026 r.

Publikacja androidx.paging:paging-*:3.5.0-alpha01 Wersja 3.5.0-alpha01 zawiera te zmiany.

Nowe funkcje

  • Artefakt paging-common zawiera teraz nowy operator przepływu asStateFlow<PagingData>, który przekształca go w Flow<ItemSnapshotList>. Dzięki temu możesz korzystać z takich funkcji jak:

    • łączyć przepływ ItemSnapshotList z innymi źródłami danych,
    • udostępnianie procesu wielu osobom zbierającym dane bez cachedIn
    • lokalne buforowanie danych podzielonych na strony,
    • modyfikować dane stronicowane w pamięci,
    • udostępniać dane podzielone na strony w ramach stanu interfejsu,
    // In your ViewModel
    val pager = Pager(pagingConfig, pagingSourceFactory)
    val pagerFlow = pager.flow.asState()
    
    // alterantively convert the flow to a SharedFlow
    val pagerFlow = pager.flow.asState().stateIn()
    
    // In presenter layer
    val snapshotFlow = viewModel.pagerFlow.collectAsStateWithLifecycle(initialList)
    val snapshot = itemsFlow.value
    
    LazyColumn {
    items(items = snapshot.items) { ... }
    }
    
  • Artefakt paging-common zawiera też interfejsy API Pager.appendPager.prepend, które umożliwiają ręczne wywoływanie wczytywania na obu końcach wczytanych elementów.

    • W połączeniu z paging-runtime lub paging-compose stanowi alternatywę dla przewijania w celu wczytania większej ilości danych.
    • W przypadku korzystania z nowego interfejsu asState API jest to jedyny sposób na wczytanie większej ilości danych.
    LazyColumn {
    item {
           /**
           * Load more items when users scroll near the top of loaded items.
           */
           LaunchedEffect(viewModel) { viewModel.prepend() }
        }
    items(snapshot.items) { item -> Text("Item: $item") }
    item {
            /**
            * Load more items when users scroll near the bottom of loaded items.
            */
          LaunchedEffect(viewModel) { viewModel.append() }
      }
    }
    
  • Dodaliśmy interfejsy Pager.refreshPager.retry, aby umożliwić odzyskiwanie danych po błędach wczytywania podczas korzystania z interfejsu asState API. Więcej przykładów użycia nowych interfejsów API znajdziesz w tym dokumencie. (I1e1e9, If3c87, Idbd48, Id1e1d, I816fe)

Wersja 3.4

Wersja 3.4.2

11 marca 2026 r.

Publikacja androidx.paging:paging-*:3.4.2 Wersja 3.4.2 zawiera te zmiany.

Bez zmian

  • Ta wersja nie wprowadza żadnych zmian w interfejsie API ani w zachowaniu w porównaniu z wersją 3.4.1.

Wersja 3.4.1

11 lutego 2026 r.

Publikacja androidx.paging:paging-*:3.4.1 Wersja 3.4.1 zawiera te zmiany.

Aktualizacja zależności

  • Zaktualizowano zależność guava w paging-guava z wersji 31.1 do 32.0.1.

Wersja 3.4.0

28 stycznia 2026 r.

Publikacja androidx.paging:paging-*:3.4.0 Wersja 3.4.0 zawiera te zmiany.

Ważne zmiany od wersji 3.3.0:

  • Dodano więcej platform docelowych KMP do paging-common, paging-testingpaging-compose. Łącznie wszystkie te platformy obsługują teraz JVM(Android i komputery), Native (Linux, iOS, watchOS, tvOS, macOS, MinGW) i Web (JavaScript, WasmJS).
  • paging-common, paging-testingpaging-compose usunęły obsługę macosX64, iosX64, watchosX64tvosX64, aby dostosować się do wycofania przez Jetbrains docelowych platform macosX64.
  • Dodaliśmy nowy interfejs PagingState API closestItemAroundPosition, który umożliwia pobieranie załadowanego elementu znajdującego się najbliżej pozycji docelowej i spełniającego warunek wejściowy. Można go używać do generowania kluczy odświeżania opartych na elementach, gdy idealny element, który można zakotwiczyć, znajduje się w pobliżu, ale nie w dokładnej pozycji docelowej.

Wersja 3.4.0-rc01

14 stycznia 2026 r.

Publikacja androidx.paging:paging-*:3.4.0-rc01 Wersja 3.4.0-rc01 zawiera te zmiany.

Nowe funkcje

Wersja 3.4.0-beta01

17 grudnia 2025 r.

Publikacja androidx.paging:paging-*:3.4.0-beta01 Wersja 3.4.0-beta01 zawiera te zmiany.

Poprawki błędów

  • Naprawiono wyścig między wczytywaniem RecyclerViewRefresh, który powodował IndexOutOfBoundsExceptionRecyclerView. Przerwane aktualizacje interfejsu z powodu ciągłego wczytywania Refresh mogą spowodować rozsynchronizowanie stanu stronicowania z RecyclerView. Problem ten rozwiązuje przywrócenie stanu sprzed odświeżenia w przypadku przerwania odświeżania (np. przez kolejne wczytanie Refresh). (I771b0, b/409809768)

Wersja 3.4.0-alpha04

10 września 2025 r.

Publikacja androidx.paging:paging-*:3.4.0-alpha04 Wersja 3.4.0-alpha04 zawiera te zmiany.

Zmiany w interfejsie API

  • Dodaliśmy nowy interfejs PagingState API closestItemAroundPosition, który umożliwia pobieranie załadowanego elementu znajdującego się najbliżej pozycji docelowej i spełniającego warunek wejściowy. Można go używać do generowania kluczy odświeżania opartych na elementach, gdy idealny element, który można zakotwiczyć, znajduje się w pobliżu, ale nie w dokładnej pozycji docelowej. (I96e5c, b/440187139)

Wersja 3.4.0-alpha03

27 sierpnia 2025 roku

Publikacja androidx.paging:paging-*:3.4.0-alpha03 Wersja 3.4.0-alpha03 zawiera te zmiany.

Nowe funkcje

  • Biblioteka Paging-common dodała platformę desktop jako nowy cel Kotlin Multiplatform (KMP). Obsługuje teraz łącznie JVM(Android i komputery), Native (Linux, iOS, watchOS, tvOS, macOS, MinGW) i Web (JavaScript, WasmJS). (Id2483, b/436884811)
  • W bibliotece Paging-testing dodaliśmy nowe platformy Kotlin Multiplatform (KMP). Obsługuje teraz łącznie JVM(Android i komputery), Native (Linux, iOS, watchOS, tvOS, macOS, MinGW) i Web (JavaScript, WasmJS). (I0c543, b/435014650)
  • Biblioteka Paging-compose ma nowe platformy docelowe Kotlin Multiplatform (KMP). Obsługuje teraz łącznie JVM(Android i komputery), Native (Linux, iOS, watchOS, tvOS, macOS, MinGW) i Web (JavaScript, WasmJS). (I70d44, b/436884801)

Zmiany w interfejsie API

Wersja 3.4.0-alpha02

30 lipca 2025 r.

Publikacja androidx.paging:paging-*:3.4.0-alpha02 Wersja 3.4.0-alpha02 zawiera te zmiany.

Zmiany w interfejsie API

  • PagingData.from umożliwia teraz ustawienie wartości placeholdersBeforeplaceholdersAfter. Pamiętaj, że przewijanie tych elementów zastępczych nie powoduje wczytywania. (I06983)

Wersja 3.4.0-alpha01

2 lipca 2025 r.

Publikacja androidx.paging:paging-*:3.4.0-alpha01 Wersja 3.4.0-alpha01 zawiera te zmiany.

Nowe funkcje

Poprawki błędów

  • Testy jednostkowe na Androidzie korzystające z biblioteki Paging w wersji 3.3 lub nowszej nie będą już zgłaszać błędów w przypadku PagingLogger (Ia9400, b/331684448).
  • Naprawiono błąd, w wyniku którego funkcja RecyclerView zgłaszała wyjątek IndexOutOfBoundsException, gdy użytkownik przewijał ekran podczas aktualizowania funkcji RecyclerView (Id1f16, b/381024738)
  • Rozwiązaliśmy problem polegający na tym, że podczas odświeżania w trakcie przewijania stronicowanie nie mogło wywołać kolejnych załadowań. (I60ca5, b/352586078)
  • Rozwiązaliśmy problem z awarią podczas przewijania podczas odświeżania elementów stronicowania. (I8c65a, b/347649763)

Wersja 3.3

Wersja 3.3.6

12 lutego 2025 r.

Publikacja androidx.paging:paging-*:3.3.6 Wersja 3.3.6 zawiera te zmiany.

Poprawki błędów

  • Sygnały odświeżania i ponawiania wysyłane podczas początkowego odświeżania będą teraz przechowywane i automatycznie ponownie wysyłane, gdy prezenter paginacji będzie gotowy.

Wkład zewnętrzny

  • Dziękujemy Evie za przesłanie poprawki błędu (#754).

Wersja 3.3.5

11 grudnia 2024 r.

Publikacja androidx.paging:paging-*:3.3.5 Wersja 3.3.5 zawiera te zmiany.

Poprawki błędów

  • Naprawiono błąd, który powodował, że funkcja RecyclerView zgłaszała błąd IndexOutOfBoundsException, gdy użytkownik przewijał stronę podczas aktualizowania RecyclerView. (Id1f16, b/381024738)

Wersja 3.3.4

13 listopada 2024 r.

Publikacja androidx.paging:paging-*:3.3.4 Wersja 3.3.4 zawiera te zmiany.

Poprawki błędów

  • Testy jednostkowe Androida korzystające z biblioteki Paging w wersji 3.3 lub nowszej nie będą już zgłaszać błędów, np. Method isLoggable in android.util.Log not mocked. (Ia9400, b/331684448)

Wersja 3.3.2

7 sierpnia 2024 r.

Publikacja androidx.paging:paging-*:3.3.2 Wersja 3.3.2 zawiera te zmiany.

Nowe funkcje

  • paging-commonpaging-testing dodano nowe platformy Kotlin Multiplatform: watchos, tvoslinuxArm64 (90c9768), (53e0eca)

Wersja 3.3.1

24 lipca 2024 r.

Publikacja androidx.paging:paging-*:3.3.1 Wersja 3.3.1 zawiera te zmiany.

Poprawki błędów

  • Rozwiązaliśmy problem, który powodował, że interfejs AsyncPagingDataDiffer lub interfejsy API oparte na nim, takie jak PagingDataAdapter używany z RecyclerView, nie mogły wywoływać kolejnych wczytań, gdy źródło danych zaplecza odświeżało się podczas przewijania. (I60ca5, b/352586078)
  • Naprawiono błąd powodujący awarię, który występował, gdy elementy były usuwane z podstawowego źródła danych podczas przewijania widoku RecyclerView za pomocą widoku PagingDataAdapter lub AsyncPagingDataDiffer. (I8c65a, b/347649763)

Wersja 3.3.0

14 maja 2024 r.

Publikacja androidx.paging:paging-*:3.3.0 Wersja 3.3.0 zawiera te zmiany.

Ważne zmiany od wersji 3.2.0

  • PagingDataPresenter to teraz klasa publiczna. Prezentery wieloplatformowe można teraz tworzyć na podstawie PagingDataPresenter, zamiast korzystać z wewnętrznych interfejsów Paging API lub paging-runtime AsyncPagingDataDiffer.
  • Dodaliśmy nowe metody pomocnicze LoadStatesCombinedLoadStateshasErrorisIdle, aby sprawdzać, czy LoadStates jest w stanie Error lub NotLoading. Dodaliśmy też nową awaitNotLoading() metodę rozszerzenia Kotlin w Flow<CombinedLoadStates>, która czeka, aż wczytywanie osiągnie stan NotLoading lub Error.
  • PagingData.empty() domyślnie wysyła stany NotLoading, chyba że do jego konstruktora zostaną przekazane niestandardowe LoadStates. Odbiega to od dotychczasowego działania, w ramach którego nie wysyła się LoadStates po przesłaniu do PagingDataAdapter lub wysyła się stany wczytywania po zebraniu jako LazyPagingItems. Gdy jest zbierana jako LazyPagingItems, od razu po utworzeniu wyświetla pustą listę.

Zgodność z Kotlin Multiplatform

Biblioteka Paging zawiera teraz artefakty zgodne z Kotlin Multiplatform, w dużej mierze dzięki pracy nad projektem multiplatform-paging zespołu CashApp.

  • paging-common przeniósł wszystkie interfejsy Paging 3 API do common i jest teraz zgodny z platformami JVM i iOS, a także z Androidem.
  • paging-testing przeniósł swój kod do common i jest teraz zgodny z platformami JVM i iOS, a także z Androidem.
  • paging-compose przeniosło swój kod do common i dostarcza artefakt Androida, który jest zgodny z obsługą wielu platform w androidx.compose.
  • paging-runtime, paging-guava, paging-rxjava2 i paging-rxjava3 pozostaną dostępne tylko na Androidzie.

Wersja 3.3.0-rc01

1 maja 2024 r.

androidx.paging:paging-*:3.3.0-rc01 została wydana bez zmian w bibliotece Paging 3.3.0-beta01. Wersja 3.3.0-rc01 zawiera te zmiany.

Wersja 3.3.0-beta01

3 kwietnia 2024 r.

Wersja androidx.paging:paging-*:3.3.0-beta01 nie zawiera znaczących zmian. Wersja 3.3.0-beta01 zawiera te zmiany.

Wersja 3.3.0-alpha05

20 marca 2024 r.

Publikacja androidx.paging:paging-*:3.3.0-alpha05 Wersja 3.3.0-alpha05 zawiera te zmiany.

Zmiany w interfejsie API

  • Biblioteka Paging korzysta teraz z adnotacji @MainThread AndroidX Annotation w przypadku wspólnego kodu. (I78f0d, b/327682438)

Wersja 3.3.0-alpha04

6 marca 2024 roku

Publikacja androidx.paging:paging-*:3.3.0-alpha04 Wersja 3.3.0-alpha04 zawiera te zmiany.

Poprawki błędów

  • Naprawiliśmy drobne błędy w dokumentacji związane z dodaniem zgodności z Kotlin Multiplatform. (aosp/2950785)

Wersja 3.3.0-alpha03

7 lutego 2024 r.

Publikacja androidx.paging:paging-*:3.3.0-alpha03 Wersja 3.3.0-alpha03 zawiera te zatwierdzenia.

Nowe funkcje

  • PagingDataPresenter to teraz klasa publiczna. Prezentery wieloplatformowe można teraz tworzyć na podstawie PagingDataPresenter, zamiast korzystać z wewnętrznych interfejsów Paging API lub paging-runtime AsyncPagingDataDiffer. (Id1f74, b/315214786)
  • Dodaliśmy nowe metody pomocnicze LoadStatesCombinedLoadStates, aby sprawdzić, czy LoadStates jest w stanie Error lub NotLoading. Dodaliśmy też nowy interfejs API, który czeka na LoadStateFlow, aż zadanie zostanie zakończone w stanie NotLoading lub Error. (Id6c67)

Zmiana zachowania

  • PagingData.empty() domyślnie wysyła stany NotLoading, chyba że do jego konstruktora zostaną przekazane niestandardowe elementy LoadStates. Odbiega to od dotychczasowego działania, w ramach którego nie wysyła się LoadStates po przesłaniu do PagingDataAdapter lub wysyła się stany wczytywania po zebraniu jako LazyPagingItems. Gdy jest zbierana jako LazyPagingItems, od razu po utworzeniu wyświetla pustą listę. (I4d11d, b/301833847)

Wersja 3.3.0-alpha02

20 września 2023 r.

Publikacja androidx.paging:paging-*:3.3.0-alpha02 Wersja 3.3.0-alpha02 zawiera te zatwierdzenia.

Zgodność z Kotlin Multiplatform

Biblioteka Paging zawiera teraz artefakty zgodne z Kotlin Multiplatform, w dużej mierze dzięki pracy nad projektem multiplatform-paging zespołu CashApp. Pozwoli nam to uniknąć rozbieżności między dwoma repozytoriami i zachować ich kompatybilność.

  • paging-common przeniósł wszystkie interfejsy Paging 3 API do common i jest teraz zgodny z JVM i iOS, a także z Androidem.
  • paging-testing przeniósł swój kod do common i jest teraz zgodny z platformami JVM i iOS, a także z Androidem.
  • paging-compose przeniosło swój kod do common i dostarcza artefakt Androida, który jest zgodny z obsługą wielu platform w androidx.compose.
  • paging-runtime, paging-guava, paging-rxjava2 i paging-rxjava3 pozostaną dostępne tylko na Androidzie.

Zmiany w interfejsie API

  • Publiczny interfejs Logger, który był przeznaczony tylko do użytku wewnętrznego, został wycofany (I16e95, b/288623117).

Wkład zewnętrzny

Wersja 3.3.0-alpha01

20 września 2023 r.

  • To pierwsza wieloplatformowa wersja bibliotek androidx.paging. Ta wersja zawiera tylko artefakty *-jvm*-android. W przypadku systemów macOS, iOS i Linux użyj znaku 3.3.0-alpha02.

Wersja 3.2

Wersja 3.2.1

6 września 2023 r.

Publikacja androidx.paging:paging-*:3.2.1 Wersja 3.2.1 zawiera te zatwierdzenia.

Poprawki błędów

  • Rozwiązaliśmy problem, który powodował zawieszanie się interfejsu asSnapshot() API artefaktu testowania stronicowania po przekazaniu do niego przepływu utworzonego za pomocą PagingData.from(List), ponieważ asSnapshot() nie miał informacji o zakończeniu wczytywania (w przeciwieństwie do przeciążenia PagingData.from(List, LoadStates)). To obejście działa tylko w przypadku przepływów, które można ukończyć (np. flowOf(PagingData.from(...))). W przypadku przepływów, których nie można ukończyć (np. MutableStateFlow), użyj przeciążenia PagingData.from, które udostępnia LoadStates. (I502c3)
  • Biblioteka Paging Compose wewnętrznie używa teraz AndroidUiDispatcher.Main, aby mieć pewność, że nowe dane są dostępne w tej samej ramce, w której kończy się wczytywanie. (Ia55af)

Wersja 3.2.0

26 lipca 2023 r.

Publikacja androidx.paging:paging-*:3.2.0 Wersja 3.2.0 zawiera te zatwierdzenia.

Ważne zmiany od wersji 3.1.0

  • Biblioteka Paging Compose osiągnęła stabilność interfejsu API i została ponownie scalona z pozostałą częścią biblioteki Paging, której wersja jest teraz zgodna ze wszystkimi innymi artefaktami Paging. Zmiany od wersji 3.1.0:
    • Obsługa podglądu listy danych testowych przez utworzenie PagingData.from(fakeData) i umieszczenie go w PagingDataMutableStateFlow (np. MutableStateFlow(PagingData.from(listOf(1, 2, 3)))). Przekaż ten przepływ do funkcji kompozycyjnych @Preview jako odbiorcę collectAsLazyPagingItems(), aby wyświetlić podgląd.
    • Obsługa wszystkich układów leniwych, takich jak LazyVerticalGridHorizontalPager, a także niestandardowych komponentów leniwych z bibliotek Wear i TV. Udało się to osiągnąć dzięki nowym metodom rozszerzeń niższego poziomu LazyPagingItemsitemKeyitemContentType, które pomagają wdrażać parametry keycontentType w standardowych interfejsach API items, które są już dostępne w przypadku LazyColumn, LazyVerticalGrid oraz ich odpowiedników w interfejsach API, takich jak HorizontalPager.
    • items(lazyPagingItems)itemsIndexed(lazyPagingItems), które obsługują tylko LazyListScope, zostały wycofane.
  • Nowy artefakt paging-testing, który udostępnia interfejsy API zaprojektowane pod kątem testowania jednostkowego każdej warstwy aplikacji i jej integracji z biblioteką Paging w izolacji. Na przykład obejmuje:
    • TestPager, która umożliwia sprawdzanie działania własnej implementacji PagingSource niezależnie od komponentu Pager i prawdziwego interfejsu.
    • ​​Interfejsy API asPagingSourceFactory do przekształcania obiektu Flow<List<Value>> lub statycznego obiektu List<Value> w obiekt PagingSourceFactory, który można przekazać do obiektu Pager w testach.
    • asSnapshot rozszerzenie Kotlin na Flow<PagingData<Value>>, które tłumaczy Flow<PagingData<Value>> na bezpośrednie List<Value>. asSnapshot lambda umożliwia naśladowanie interfejsu aplikacji za pomocą interfejsów API, takich jak scrollTo czy appendScrollWhile, dzięki czemu możesz w dowolnym momencie sprawdzić, czy migawka danych jest prawidłowa w zestawie danych podzielonych na strony.
  • Dodaliśmy domyślne logi, aby udostępniać informacje na potrzeby debugowania biblioteki Paging na 2 poziomach: VERBOSEDEBUG. Dzienniki można włączyć za pomocą polecenia adb shell setprop log.tag.Paging [DEBUG|VERBOSE]. Dotyczy to zarówno stronicowania z widokami, jak i stronicowania z funkcją Compose.
  • Dodano konstruktory dla PagingDataAdapter i AsyncPagingDataDiffer, które akceptują CoroutineContext zamiast CoroutineDispatcher.
  • Dodaliśmy nowy PagingSourceFactory interfejs funkcyjny, który zapewnia bardziej jednoznaczny interfejs API niż poprzednie lambdy () -> PagingSource. Za pomocą tej fabryki można utworzyć instancję klasy Pager.

Wersja 3.2.0-rc01

21 czerwca 2023 r.

Publikacja androidx.paging:paging-*:3.2.0-rc01 Wersja 3.2.0-rc01 zawiera te zatwierdzenia.

Wkład zewnętrzny

  • Dziękujemy Veyndanowi za pomoc w odchodzeniu od specyfiki Androida i JVM w przypadku biblioteki Paging. (#553, #554, #555, #559)

Wersja 3.2.0-beta01

7 czerwca 2023 r.

Publikacja androidx.paging:paging-*:3.2.0-beta01 Wersja 3.2.0-beta01 zawiera te zatwierdzenia.

Paging Compose

  • Biblioteka Paging Compose osiągnęła oficjalnie stabilność interfejsu API. W związku z tym wersja została zaktualizowana z 1.0.0-alpha20, aby pasowała do wersji wszystkich innych artefaktów stronicowania.

Zmiany w interfejsie API

Wersja 3.2.0-alpha06

24 maja 2023 r.

Publikacja androidx.paging:paging-*:3.2.0-alpha06 Wersja 3.2.0-alpha06 zawiera te zmiany.

Nowe funkcje

  • Dodaliśmy nowy PagingSourceFactory interfejs funkcyjny, który zapewnia bardziej jednoznaczny interfejs API niż dotychczasowe wyrażenia lambda () -> PagingSource. Za pomocą tej fabryki można utworzyć instancję klasy Pager. (I33165, b/280655188)
  • Dodano nowy paging-testinginterfejs API List<Value>.asPagingSourceFactory(), który umożliwia uzyskanie PagingSourceFactory, które wczytuje dane tylko z niezmiennej listy danych. Do testowania z użyciem wielu generacji danych statycznych należy nadal używać dotychczasowego rozszerzenia w Flow<List<Value>>. (Id34d1, b/280655188)

Zmiany w interfejsie API

  • Wszystkie publiczne interfejsy API w paging-testing są teraz oznaczone adnotacją @VisibleForTesting, aby mieć pewność, że są używane tylko w testach. (I7db6e)
  • Interfejs asSnapshot API nie wymaga już przekazywania parametru CoroutineScope. Teraz domyślnie używa kontekstu odziedziczonego z zakresu nadrzędnego. (Id0a78, b/282240990)
  • Zmieniono kolejność parametrów konstruktora TestPager, aby intuicyjnie pasowała do kolejności rzeczywistych parametrów konstruktora Pager (I6185a).
  • Zmieniliśmy typ funkcji lambda () -> PagingSource<Key, Value> na typ PagingSourceFactory<Key, Value> w przypadku testowania stronicowania. (I4a950, b/280655188)

Zmiany w zachowaniu

  • Główny dyspozytor nie jest już wymagany do przeprowadzania asSnapshottestów stronicowania. Ustawienie tego parametru nie powoduje już żadnych zmian w działaniu testu. (Ie56ea)

Wersja 3.2.0-alpha05

3 maja 2023 r.

Publikacja androidx.paging:paging-*:3.2.0-alpha05 Wersja 3.2.0-alpha05 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Interfejs Paging Testing API w asSnapshot ma teraz domyślnie ustawiony parametr loadOperations na pustą funkcję lambda. Umożliwia to wywoływanie asSnapshot bez przekazywania żadnych operacji wczytywania w celu pobrania danych z początkowego wczytywania odświeżania. (Ied354, b/277233770)

Ulepszenia dokumentacji

  • Zaktualizowaliśmy dokumentację dotyczącą asPagingSourceFactory(), aby wyjaśnić, że jest to metoda rozszerzająca w Flow, która zwraca fabrykę wielokrotnego użytku do generowania instancji PagingSource. (I5ff4f, I705b5)
  • Zaktualizowaliśmy dokumentację konstruktora LoadResult.Page, aby wyjaśnić, że w celu obsługi skakania należy zastąpić funkcje itemsBeforeitemsAfter. (Ied354)

Wkład zewnętrzny

Wersja 3.2.0-alpha04

8 lutego 2023 r.

Publikacja androidx.paging:paging-*:3.2.0-alpha04 Wersja 3.2.0-alpha04 zawiera te zatwierdzenia.

Testowanie stronicowania

  • Artefakt paging-testing zawiera teraz metodę asPagingSourceFactory, która tworzy obiekt pagingSourceFactory z obiektu Flow<List<Value>>, który ma być dostarczony do komponentu Pager. Każdy sygnał List<Value>> emitowany z Flow reprezentuje generowanie danych podzielonych na strony. Ułatwia to testowanie stronicowania, np. PagingData przekształceń, poprzez symulowanie źródła danych, z którego moduł stronicowania może pobierać dane. (I6f230, b/235528239)
  • paging-testing został rozszerzony o nowe interfejsy API, które umożliwiają weryfikację poprawności danych zawartych w Flow<PagingData<T>>. Można go używać np. do potwierdzania danych wyjściowych Flow<PagingData<T>> z warstwy ViewModel.

    Odbywa się to za pomocą asSnapshotrozszerzenia Kotlin w Flow<PagingData<Value>>, które przekształca Flow<PagingData<Value>> w bezpośredni List<Value>. Funkcja asSnapshot umożliwia naśladowanie interfejsu aplikacji za pomocą interfejsów API, takich jak scrollTo lub appendScrollWhile, w powtarzalny i spójny sposób, dzięki czemu możesz w dowolnym momencie sprawdzić, czy migawka danych jest prawidłowa w zbiorze danych podzielonych na strony.

    // 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 to metoda suspend, która powinna być uruchamiana w runTest. Więcej informacji znajdziesz w artykule Testowanie współprogramów Kotlin na Androidzie. (I55fd2, I5bd26, I7ce34, I51f4d, I2249f, Id6223, Ic4bab, Ib29b9, Ic1238, I96def, b/235528239)

Zmiany w interfejsie API

  • Wywołania interfejsu getItempeekAsyncPagingDataDifferPagingDataAdapter są teraz prawidłowo oznaczane jako wywoływane tylko w wątku głównym. (I699b6)
  • Usunęliśmy symbole wieloznaczne z typów ogólnych używanych przez TestPager, co ułatwia korzystanie z wyników tych metod w kodzie napisanym w języku programowania Java. (I56c42)

Wersja 3.2.0-alpha03

24 października 2022 r.

Publikacja androidx.paging:paging-*:3.2.0-alpha03 Wersja 3.2.0-alpha03 zawiera te zatwierdzenia.

Testowanie stronicowania

Ta wersja zawiera nowy artefakt: paging-testing. Ten artefakt udostępnia interfejsy API zaprojektowane pod kątem testowania jednostkowego każdej warstwy aplikacji i jej integracji z biblioteką Paging w izolacji.

Na przykład ta pierwsza wersja zawiera klasę TestPager, która umożliwia weryfikowanie działania własnej implementacji niestandardowej PagingSource niezależnie od Pager i rzeczywistego interfejsu, którego zwykle potrzebujesz do symulowania kompleksowej integracji biblioteki Paging.

TestPager należy uznać za fałszywy obiekt – zamiennik testowy, który odzwierciedla rzeczywistą implementację Pager, a jednocześnie udostępnia uproszczony interfejs API do testowania PagingSource. Te interfejsy API to interfejsy suspend, które należy uruchamiać w ramach runTest zgodnie z przewodnikiem Testowanie korutyn Kotlin na Androidzie.

Przykład użycia tych interfejsów API można znaleźć w room-pagingtestach, które zostały zmodyfikowane tak, aby korzystać z TestPager.

Zmiany w interfejsie API

  • Umożliwia wygodne iterowanie po LoadResult.Page.data za pomocą LoadResult.Page.iterator(). Umożliwia to pośrednio użycie metody biblioteki standardowej Kotlin w przypadku podania wartości List<LoadResult.Page>, np. właściwości pages elementu PagingState, która jest przekazywana do metody PagingSource.getRefreshKey.flatten (Ie0718)

Wersja 3.2.0-alpha02

10 sierpnia 2022 r.

Publikacja androidx.paging:paging-*:3.2.0-alpha02 Wersja 3.2.0-alpha02 zawiera te zatwierdzenia.

Nowe funkcje

  • Biblioteka Paging udostępnia teraz dzienniki za pomocą klas AsyncPagingDataDifferlub PagingDataAdapter, aby udostępniać informacje na potrzeby debugowania zebrane z PagingData.
  • Dzienniki można włączyć za pomocą polecenia adb shell adb shell setprop log.tag.Paging [DEBUG|VERBOSE].(b/235527159).

Poprawki błędów

  • Usunęliśmy błąd braku konstruktora PagingDataDiffer podczas używania paging-common:3.2.0-alpha01 z wersją środowiska wykonawczego paging-runtime:3.1.1 lub starszą.(b/235256201)

Wersja 3.2.0-alpha01

1 czerwca 2022 r.

Publikacja androidx.paging:paging-*:3.2.0-alpha01 Wersja 3.2.0-alpha01 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Dodano konstruktory dla PagingDataAdapter i AsyncPagingDataDiffer, które akceptują CoroutineContext zamiast CoroutineDispatcher. (Idc878)
  • Domyślnie zasady PagingData.from() i PagingData.empty() nie mają już wpływu na CombinedLoadStates po stronie prezentera. Dodaliśmy nowy przeciążony konstruktor, który umożliwia przekazywanie wartości sourceLoadStatesremoteLoadStates, aby zachować dotychczasowe działanie polegające na ustawianiu wartości LoadStates jako w pełni końcowej (tzn. NotLoading(endOfPaginationReached = false)), z możliwością uwzględnienia w razie potrzeby stanów zdalnych. Jeśli LoadStates nie zostaną przekazane, poprzednie CombinedLoadStates zostaną zachowane po stronie prezentera, gdy otrzyma on statyczny PagingData. (Ic3ce5, b/205344028)

Poprawki błędów

  • Wynik funkcji PagingSource.getRefreshKey() ma teraz prawidłowy priorytet w stosunku do funkcji initialKey w przypadkach, gdy zwraca wartość null, ale ustawiono wartość niezerową funkcji initialKey. (Ic9542, b/230391606)

Wkład zewnętrzny

  • Zaktualizowano interfejs API :compose:ui:ui-test (updateApi) z powodu migracji biblioteki test-coroutines-lib (I3366d)

Wersja 3.1

Wersja 3.1.1

9 marca 2022 r.

Publikacja androidx.paging:paging-*:3.1.1 Wersja 3.1.1 zawiera te zatwierdzenia.

Poprawki błędów

  • Usunięto pośrednie zdarzenia LoadState.NotLoading między generacjami, które zostały nieprawidłowo wstawione przez .cachedIn(). Ta zmiana znacznie ułatwia reagowanie na zmiany LoadState, ponieważ usuwa zbędne zdarzenia LoadState.NotLoading, które były generowane między ponownymi próbami nieudanych wczytań, podczas odświeżania lub unieważniania.

Wersja 3.1.0

17 listopada 2021 r.

Publikacja androidx.paging:paging-*:3.1.0 Wersja 3.1.0 zawiera te zatwierdzenia.

Ważne zmiany od wersji 3.0.0

  • Interfejsy API Flow<PagingData>.observableFlow<PagingData>.flowable nie są już eksperymentalne
  • Zmiany w działaniu LoadState:
    • endOfPaginationReached to teraz zawsze false w przypadku LoadType.REFRESH zarówno w PagingSource, jak i w RemoteMediator
    • LoadStates z Pagingu oczekuje teraz prawidłowych wartości z PagingSourceRemoteMediator, zanim przekaże je dalej. Nowe generacje PagingData będą teraz zawsze prawidłowo zaczynać się od Loading w przypadku stanu odświeżania, zamiast w niektórych przypadkach nieprawidłowo resetować się do NotLoading.
    • .loadStateFlow i .addLoadStateListener w interfejsach API prezentera nie wysyłają już nadmiarowo początkowego CombinedLoadStates, który zawsze ma stany pośrednika ustawione na null
  • Anulowanie w przypadku poprzednich generacji następuje teraz od razu po unieważnieniu lub wygenerowaniu nowych treści. Nie powinno być już konieczne używanie znaku .collectLatest na Flow<PagingData>, chociaż nadal zalecamy to robić.
  • PagingSource.LoadResult.Invalid został dodany jako nowy typ zwracany z PagingSource.load, co powoduje, że biblioteka Paging odrzuca wszystkie oczekujące lub przyszłe żądania wczytania do tego PagingSource i unieważnia go. Ten zwracany typ jest przeznaczony do obsługi potencjalnie nieprawidłowych lub nieaktualnych danych, które mogą być zwracane z bazy danych lub sieci.
  • Dodano interfejsy API prowadzącego .onPagesPresented.addOnPagesUpdatedListener, które są wywoływane synchronicznie podczas wyświetlania stron w interfejsie. Aktualizacje strony mogą nastąpić w tych sytuacjach:
    • Początkowe wczytywanie nowej generacji PagingData zostanie zakończone niezależnie od tego, czy nowa generacja zawiera jakiekolwiek zmiany w prezentowanych elementach. Nowa generacja, która zakończy wczytywanie początkowe bez aktualizacji, ponieważ lista jest dokładnie taka sama, nadal wywoła to wywołanie zwrotne.
    • Strona jest wstawiana nawet wtedy, gdy nie zawiera nowych elementów.
    • Strona jest pomijana, nawet jeśli była pusta.

Wersja 3.1.0-rc01

3 listopada 2021 r.

Publikacja androidx.paging:paging-*:3.1.0-rc01 Wersja 3.1.0-rc01 zawiera te zatwierdzenia.

Poprawki błędów

  • Rozwiązano problem z sytuacją wyścigu i wyciekiem pamięci w funkcji .cachedIn() w przypadkach, gdy Paging wysyłał wiele zdarzeń wczytywania w dół, gdy nie było obserwatorów lub gdy obserwator przełączał się na nowe PagingData. (Ib682e)

Wersja 3.1.0-beta01

13 października 2021 r.

Publikacja androidx.paging:paging-*:3.1.0-beta01 Wersja 3.1.0-beta01 zawiera te zatwierdzenia.

Poprawki błędów

  • Rozwiązaliśmy problem, w którym wiele szybkich dostępów do elementów mogło powodować ich pomijanie w przypadku parametru prefetchDistance, co prowadziło do wstrzymania wczytywania stron. Jest to szczególnie problematyczne, gdy wiele elementów jest ułożonych jednocześnie w kolejności, która priorytetowo traktuje ładowanie w kierunku przeciwnym do kierunku przewijania przez użytkownika. Dostęp do tych elementów jest teraz buforowany i synchronicznie traktowany priorytetowo, aby zapobiec ich utracie. (aosp/1833273)

Wersja 3.1.0-alpha04

29 września 2021 r.

Publikacja androidx.paging:paging-*:3.1.0-alpha04 Wersja 3.1.0-alpha04 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Interfejsy Flow<PagingData>.observableFlow<PagingData>.flowable API nie są już eksperymentalne. (Ie0bdd)

Poprawki błędów

  • W przypadku LoadStates wartość endOfPaginationReached jest teraz zawsze false dla LoadType.REFRESH. Wcześniej w przypadku elementu RemoteMediator wartość endOfPaginationReached mogła wynosić true, ale nie w przypadku elementu PagingSource.REFRESH To zachowanie zostało teraz ujednolicone, aby zawsze zwracać wartość false, ponieważ odświeżanie nigdy nie powinno być końcowe. Zostało to udokumentowane w ramach umowy API w LoadStates. Decydując o zakończeniu paginacji, zawsze należy to robić w odniesieniu do kierunków APPEND lub PREPEND. (I047b6)
  • LoadStates z Paging czekają teraz na prawidłowe wartości z PagingSource i RemoteMediator, zanim wyemitują je w dół między generacjami. Zapobiega to wysyłaniu przez nowe generacje PagingData stanu NotLoading w CombinedLoadStates.source.refresh, jeśli był już w stanie Loading. Nowe generacje PagingData będą teraz zawsze prawidłowo rozpoczynać stan odświeżania od stanu Loading, zamiast najpierw nieprawidłowo resetować się do stanu NotLoading w niektórych przypadkach.

    Anulowanie w przypadku poprzednich generacji następuje teraz natychmiast po unieważnieniu lub wygenerowaniu nowych treści. Nie powinno być już konieczne używanie funkcji .collectLatest w przypadku Flow<PagingData>, chociaż nadal jest to wysoce zalecane. (I0b2b5, b/177351336, b/195028524)

  • Interfejsy API .loadStateFlow.addLoadStateListener dotyczące prezenterów nie wysyłają już nadmiarowo początkowego parametru CombinedLoadStates, który zawsze ma stany pośrednika ustawione na null, a stany źródła na NotLoading(endOfPaginationReached = false). Oznacza to, że:

    1. Jeśli używasz RemoteMediator, stany pośrednika będą zawsze wypełniane.
    2. Rejestrowanie nowego odbiorcy loadState lub nowego kolektora na .loadStateFlow nie będzie już natychmiast emitować bieżącej wartości jeśli nie otrzymał on rzeczywistego CombinedLoadStates z PagingData. Może się tak zdarzyć, jeśli zbierający lub detektor zostanie uruchomiony przed przesłaniem PagingData. (I1a748)

Wersja 3.1.0-alpha03

21 lipca 2021 r.

Publikacja androidx.paging:paging-*:3.1.0-alpha03 Wersja 3.1.0-alpha03 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Do klasy PagingSource dodano trzeci typ zwracany LoadResult LoadResult.Invalid. Gdy funkcja PagingSource.load zwraca LoadResult.Invalid, biblioteka do stronicowania odrzuca wczytane dane i unieważnia PagingSource. Ten zwracany typ został zaprojektowany do obsługi potencjalnie nieprawidłowych lub nieaktualnych danych, które mogą być zwracane z bazy danych lub sieci.

    Jeśli na przykład dane są zapisywane w bazie danych, ale obiekt PagingSource nie zostanie w odpowiednim czasie unieważniony, może zwrócić niespójne wyniki, jeśli jego implementacja zależy od niezmienności zbioru danych, z którego pobiera dane (np. implementacje bazy danych w stylu LIMIT OFFSET). W takim przypadku zalecamy sprawdzenie, czy po wczytaniu nie doszło do unieważnienia, i zwrócenie wartości LoadResult.Invalid, co spowoduje odrzucenie przez bibliotekę Paging wszystkich oczekujących lub przyszłych żądań wczytania do tego obiektu PagingSource i jego unieważnienie.

    Ten typ zwracany jest też obsługiwany przez interfejs Paging2 API, który korzysta z LivePagedList lub RxPagedList. Gdy używasz elementu PagingSource z interfejsami PagedList API biblioteki Paging2, element PagedList jest natychmiast odłączany, co powoduje zatrzymanie dalszych prób wczytania danych do tego elementu PagedList i wywołuje unieważnienie w elemencie PagingSource.

    LoadResult to klasa zamknięta, co oznacza, że jest to zmiana niezgodna ze źródłem, więc przypadki użycia bezpośrednio korzystające z wyników PagingSource.load będą musiały obsługiwać LoadResult.Invalid w czasie kompilacji. Na przykład użytkownicy języka Kotlin korzystający z funkcji exhaustive-when do sprawdzania zwracanego typu będą musieli dodać sprawdzanie typu Invalid. (Id6bd3, b/191806126, b/192013267)

Poprawki błędów

  • Wywołania zwrotne unieważnienia dodane za pomocą funkcji PagingSource.registerInvalidatedCallback lub DataSource.addInvalidatedCallback są teraz automatycznie wywoływane, jeśli zostały zarejestrowane w obiekcie PagingSource lub DataSource, który był już nieprawidłowy. Rozwiązuje to problem z sytuacją wyścigu, który powodował, że Paging odrzucało sygnały unieważnienia i zawieszało się, gdy podczas początkowego wczytywania podano źródło, które było już nieprawidłowe. Dodatkowo wywołania zwrotne invalidate są teraz prawidłowo usuwane po wywołaniu, ponieważ są wywoływane co najwyżej raz. (I27e69)
  • Przesłanie początkowej wartości zastępczej (InitialPagedList) z nowo utworzonego strumienia PagedList, np. LivePagedListBuilder lub RxPagedListBuilder, nie spowoduje już wyczyszczenia wcześniej wczytanych danych.

Wersja 3.1.0-alpha02

1 lipca 2021 r.

Publikacja androidx.paging:paging-*:3.1.0-alpha02 Wersja 3.1.0-alpha02 zawiera te zatwierdzenia.

Nowe funkcje

  • Dodano interfejsy API OnPagesPresented listener i flow presenter, które są wywoływane natychmiast po zaktualizowaniu w interfejsie wyświetlanych stron.

    Ponieważ te aktualizacje są synchroniczne z interfejsem, możesz wywoływać metody adaptera, takie jak .snapshot czy .getItemCount, aby sprawdzić stan po zastosowaniu aktualizacji. Pamiętaj, że wywołanie funkcji .snapshot() zostało pozostawione do jawnego wywołania, ponieważ może być kosztowne przy każdej aktualizacji.

    Aktualizacje strony mogą wystąpić w tych przypadkach:

    • Początkowe wczytywanie nowej generacji PagingData zostanie zakończone niezależnie od tego, czy nowa generacja zawiera jakiekolwiek zmiany w prezentowanych elementach. Nowa generacja, która zakończy wczytywanie początkowe bez aktualizacji, ponieważ lista jest dokładnie taka sama, nadal wywoła to wywołanie zwrotne.
    • Strona jest wstawiana, nawet jeśli nie zawiera nowych elementów.
    • Strona jest usuwana, nawet jeśli była pusta (I272c9, b/189999634).

Poprawki błędów

  • Dostęp do PagedList.dataSource z wartości początkowej wygenerowanej przez LivePagedList lub RxPagedList nie będzie już nieprawidłowo powodować zgłaszania wyjątku IllegalStateException (I96707).

Wersja 3.1.0-alpha01

2 czerwca 2021 r.

Publikacja androidx.paging:paging-*:3.1.0-alpha01 Wersja 3.1.0-alpha01 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Klasy udostępniane przez paging-rxjava3 znajdują się teraz w pakiecie androidx.paging.rxjava3, dzięki czemu nie powodują konfliktów z paging-rxjava2 (Ifa7f6).

Poprawki błędów

  • Rozwiązaliśmy problem, który powodował, że biblioteka Paging czasami wysyłała do elementu RecyclerView zdarzenia różnicowe no-op, co mogło powodować wcześniejsze wywoływanie niektórych odbiorników. (Ic507f, b/182510751)

Wkład zewnętrzny

  • Dodano do artefaktu rxjava3 wycofane interfejsy API zgodności PagedList (Id1ce2, b/182497591)

Paging Compose w wersji 1.0.0

Wersja 1.0.0-alpha20

24 maja 2023 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha20 Wersja 1.0.0-alpha20 zawiera te zmiany.

Nowe funkcje

  • Paging Compose obsługuje teraz wyświetlanie podglądu listy danych testowych przez utworzenie PagingData.from(fakeData) i umieszczenie go w MutableStateFlow (np. MutableStateFlow(PagingData.from(listOf(1, 2, 3)))). Jeśli użyjesz tych danych jako danych wejściowych w @Preview, wywołania collectAsLazyPagingItems() będą zwracać LazyPagingItems, których podgląd można wyświetlić.PagingData (I8a78d, b/194544557)

Poprawki błędów

  • Dane z pamięci podręcznej z pager.flow.cachedIn zebrane w LazyPagingItems będą teraz dostępne natychmiast po przywróceniu stanu bez konieczności asynchronicznego zbierania. Oznacza to, że dane z pamięci podręcznej będą gotowe do wyświetlenia od razu po początkowym utworzeniu kompozycji po przywróceniu stanu. (I97a60, b/177245496)

Wersja 1.0.0-alpha19

3 maja 2023 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha19 Wersja 1.0.0-alpha19 zawiera te zmiany.

Obsługa wszystkich układów leniwych

Wcześniej Paging Compose udostępniało niestandardowe rozszerzenia itemsitemsIndexedLazyListScope, co oznaczało, że nie można było używać Paging Compose z innymi układami ładowanymi z opóźnieniem, takimi jak LazyVerticalGrid, HorizontalPager czy inne niestandardowe komponenty ładowane z opóźnieniem udostępniane przez biblioteki Wear i TV. Główną zmianą w tej wersji jest rozwiązanie problemu z brakiem elastyczności.

Aby obsługiwać więcej układów leniwych, musieliśmy utworzyć interfejsy API na innym poziomie. Zamiast udostępniać niestandardowy interfejs API items dla każdego układu leniwego, Paging Compose udostępnia teraz metody rozszerzające niższego poziomu w LazyPagingItemsitemKeyitemContentType. Te interfejsy API pomagają wdrażać parametry keycontentType w standardowych interfejsach API items, które są już dostępne w przypadku LazyColumn, LazyVerticalGrid, a także ich odpowiedników w interfejsach API, takich jak HorizontalPager. (Ifa13b, Ib04f0, b/259385813)

Oznacza to, że obsługa znaku LazyVerticalGrid wyglądałaby tak:

// 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)
  }
}

Więcej przykładów użycia tych nowych interfejsów API znajdziesz w naszych przykładach.

Chociaż te zmiany wydłużają przykłady LazyColumnLazyRow o kilka wierszy, uznaliśmy, że spójność we wszystkich układach ładowanych z opóźnieniem jest ważnym czynnikiem dla osób, które w przyszłości będą korzystać z biblioteki Paging Compose. Z tego powodu dotychczasowe rozszerzenia LazyListScope zostały wycofane. (I0c459, I92c8f, b/276989796)

Zmiany w interfejsie API

  • Aby ułatwić migrację do nowych interfejsów API, funkcje rozszerzeń itemsitemsIndexedLazyListScope obsługują teraz parametr contentType, co odzwierciedla obsługę w nowych interfejsach API. (Ib1918, b/255283378)

Aktualizacje zależności

  • Biblioteka Paging Compose zaktualizowała zależność z Compose 1.0.5 na Compose 1.2.1. (Ib1918, b/255283378)

Wersja 1.0.0-alpha18

8 lutego 2023 r.

androidx.paging:paging-compose:1.0.0-alpha18 zostaje opublikowany bez zmian. Wersja 1.0.0-alpha18 zawiera te zatwierdzenia.

Wersja 1.0.0-alpha17

24 października 2022 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha17 Wersja 1.0.0-alpha17 zawiera te zatwierdzenia.

Nowe funkcje

  • Dodaliśmy obsługę niestandardowego parametru CoroutineContext podczas wywoływania funkcji collectLazyPagingItems. (I7a574, b/243182795, b/233783862)

Wersja 1.0.0-alpha16

10 sierpnia 2022 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha16 Wersja 1.0.0-alpha16 zawiera te zatwierdzenia.

Nowe funkcje

  • Biblioteka Paging udostępnia teraz dzienniki za pomocą klasy LazyPagingItems, aby udostępniać informacje na potrzeby debugowania zebrane z obiektu PagingData.
  • Dzienniki można włączyć za pomocą polecenia adb shell adb shell setprop log.tag.Paging [DEBUG|VERBOSE]. ([b/235527159}(https://issuetracker.google.com/issues/235527159))

Poprawki błędów

  • Naprawiono błąd braku konstruktora PagingDataDiffer podczas używania paging-compose:1.0.0-alpha15paging-common:3.1.1 lub starszymi wersjami.(b/235256201,b/239868768)

Wersja 1.0.0-alpha15

1 czerwca 2022 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha15 Wersja 1.0.0-alpha15 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Dodano konstruktory dla PagingDataAdapter i AsyncPagingDataDiffer, które akceptują CoroutineContext zamiast CoroutineDispatcher. (Idc878)

Poprawki błędów

  • LazyPagingItems ustawia teraz początkową wartość loadState na LoadState.Loading. (I55043, b/224855902)

Wersja 1.0.0-alpha14

13 października 2021 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha14 Wersja 1.0.0-alpha14 zawiera te zatwierdzenia.

Wersja 1.0.0-alpha13

29 września 2021 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha13 Wersja 1.0.0-alpha13 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Funkcja LazyPagingItems.snapshot() została zastąpiona właściwością LazyPagingItems.itemSnapshotList (Ie2da8)
  • Wycofane pole LazyPagingItems.getAsState() zostało usunięte (Ie65e4)

Wersja 1.0.0-alpha12

21 lipca 2021 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha12 Wersja 1.0.0-alpha12 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Funkcje items(lazyPagingItems)itemsIndexed(lazyPagingItems) używane do łączenia paginacji z LazyColumn/Row akceptują teraz parametr klucza opcji, który umożliwia określenie stabilnego klucza reprezentującego element. Więcej informacji o kluczach znajdziesz tutaj. (I7986d)
  • Funkcja lazyPagingItems.getAsState(index) została wycofana. Użyj w zamian zasady lazyPagingItems[index]. (I086cb, b/187339372)

Wersja 1.0.0-alpha11

30 czerwca 2021 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha11 Wersja 1.0.0-alpha11 zawiera te zatwierdzenia.

Wersja 1.0.0-alpha10

2 czerwca 2021 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha10 Wersja 1.0.0-alpha10 zawiera te zatwierdzenia.

Wersja 1.0.0-alpha09

18 maja 2021 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha09 Wersja 1.0.0-alpha09 zawiera te zatwierdzenia.

Poprawki błędów

  • Wartości itemCount i funkcja pobierania elementów w komponencie LazyPagingItems są teraz możliwe do obserwowania, co pozwala na używanie go również z komponentem LazyVerticalGrid (Ie2446, b/171872064, b/168285687).

Zgodność z Compose

  • androidx.paging:paging-compose:1.0.0-alpha09 jest zgodny tylko z Compose w wersji 1.0.0-beta07 lub nowszej.

Wersja 1.0.0-alpha08

24 lutego 2021 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha08 Wersja 1.0.0-alpha08 zawiera te zatwierdzenia.

Zaktualizowano integrację z Compose w wersji 1.0.0-beta01.

Wersja 1.0.0-alpha07

10 lutego 2021 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha07 Wersja 1.0.0-alpha07 zawiera te zatwierdzenia.

Zaktualizowano integrację z Compose w wersji alfa12.

Wersja 1.0.0-alpha06

28 stycznia 2021 roku

Publikacja androidx.paging:paging-compose:1.0.0-alpha06 Wersja 1.0.0-alpha06 zawiera te zatwierdzenia.

Poprawki błędów

Zaktualizowano, aby zależał od Compose w wersji 1.0.0-alpha11.

Wersja 1.0.0-alpha05

13 stycznia 2021 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha05 Wersja 1.0.0-alpha05 zawiera te zatwierdzenia.

Zaktualizowano, aby zależał od Compose w wersji 1.0.0-alpha10.

Wersja 1.0.0-alpha04

16 grudnia 2020 roku

Publikacja androidx.paging:paging-compose:1.0.0-alpha04 Wersja 1.0.0-alpha04 zawiera te zatwierdzenia.

Poprawki błędów

  • Zaktualizowano właściwości wygody:CombinedLoadStates.refresh, CombinedLoadStates.prepend,CombinedLoadStates.append, aby przejście ze stanu Loading do NotLoading następowało tylko wtedy, gdy stany wczytywania zarówno pośrednika, jak i źródła są równe NotLoading. Dzięki temu zdalna aktualizacja zostanie zastosowana. (I65619)

Wersja 1.0.0-alpha03

2 grudnia 2020 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha03 Wersja 1.0.0-alpha03 zawiera te zatwierdzenia.

  • Zaktualizowano, aby pasował do wersji Compose 1.0.0-alpha08.

Wersja 1.0.0-alpha02

11 listopada 2020 roku

Publikacja androidx.paging:paging-compose:1.0.0-alpha02 Wersja 1.0.0-alpha02 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Dodano metody .peek(), .snapshot(), .retry().refresh() do interfejsu LazyPagingItems, które udostępniają te same funkcje co interfejsy AsyncPagingDataDiffer / PagingDataAdapter (Iddfe8, b/172041660).

Wersja 1.0.0-alpha01

28 października 2020 r.

Publikacja androidx.paging:paging-compose:1.0.0-alpha01 Wersja 1.0.0-alpha01 zawiera te zatwierdzenia.

Nowe funkcje

Artefakt paging-compose zapewnia integrację między biblioteką PagingJetpack Compose. Prosty przykład użycia:

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

Wersja 3.0.1

Wersja 3.0.1

21 lipca 2021 r.

Publikacja androidx.paging:paging-*:3.0.1 Wersja 3.0.1 zawiera te zatwierdzenia.

Poprawki błędów

  • Dostęp do PagedList.dataSource z wartości początkowej wygenerowanej przez LivePagedList lub RxPagedList nie będzie już nieprawidłowo powodować zgłaszania wyjątku IllegalStateException (I96707).

Wersja 3.0.0

Wersja 3.0.0

5 maja 2021 roku

Publikacja androidx.paging:paging-*:3.0.0 Wersja 3.0.0 zawiera te zatwierdzenia.

Główne funkcje wersji 3.0.0

Większość dotychczasowego interfejsu API z biblioteki Paging w wersji 2.x.x została wycofana na rzecz nowych interfejsów API z biblioteki Paging 3, aby wprowadzić te ulepszenia:

  • Pełna obsługa współprogramów i środowiska Flow w języku Kotlin
  • Pomoc dotycząca anulowania
  • Wbudowane sygnały stanu wczytywania i błędu
  • Funkcja ponawiania i odświeżania
  • Wszystkie 3 podklasy DataSource zostały połączone w jedną klasę PagingSource.
  • Niestandardowe przekształcenia stron, w tym wbudowane przekształcenie do dodawania separatorów
  • Wczytywanie nagłówków i stopek stanu

Wersja 3.0.0-rc01

21 kwietnia 2021 r.

Publikacja androidx.paging:paging-*:3.0.0-rc01 Wersja 3.0.0-rc01 zawiera te zatwierdzenia.

Poprawki błędów

  • Rozwiązaliśmy problem, który powodował, że biblioteka Paging czasami wysyłała do elementu RecyclerView zdarzenia różnicowe no-op, co mogło powodować wcześniejsze wywoływanie niektórych odbiorników. (Ic507f, b/182510751)

Wersja 3.0.0-beta03

24 marca 2021 r.

Publikacja androidx.paging:paging-*:3.0.0-beta03 Wersja 3.0.0-beta03 zawiera te zatwierdzenia.

Poprawki błędów

  • Zmieniliśmy sposób obsługi elementów zastępczych podczas ponownego wczytywania listy, aby zapobiec nieoczekiwanym przeskokom w widoku RecyclerView. Szczegółowe informacje znajdziesz w NullPaddedDiffing.md. (If1490, b/170027529, b/177338149)
  • Różne konstruktory PagedList (stara ścieżka zgodności) nie wywołują już nieprawidłowo synchronicznie funkcji DataSource.Factory.create() w głównym wątku, gdy wywoływana jest funkcja .build(). (b/182798948)

Wersja 3.0.0-beta02

10 marca 2021 r.

Publikacja androidx.paging:paging-*:3.0.0-beta02 Wersja 3.0.0-beta02 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Rozszerzenia Rx3 prawidłowo propagują teraz wymaganie @ExperimentalCoroutinesApi Opt-In. Wcześniej były one oznaczane w @get, co jest ignorowane przez kompilator Kotlin z tych powodów: https://youtrack.jetbrains.com/issue/KT-45227 (I5733c)

Poprawki błędów

  • Wymuszanie ograniczeń dotyczących publicznego korzystania z eksperymentalnych interfejsów API (I6aa29, b/174531520)
  • Naprawiliśmy błąd, który powodował, że w przypadku wywołania zdalnego odświeżania wartość PagingState zawsze wynosiła null.
  • Naprawiliśmy błąd, w którym puste strony zwracane przez PagingSource mogły uniemożliwiać ponowne pobieranie danych przez Paging w celu spełnienia warunku prefetchDistance, co powodowało „zablokowanie” Paging.

Wersja 3.0.0-beta01

10 lutego 2021 r.

Publikacja androidx.paging:paging-*:3.0.0-beta01 Wersja 3.0.0-beta01 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Otoczki Rx2 i Rx3 udostępniają teraz eksperymentalną adnotację, od której zależą. Jeśli używasz otoczek zgodności Rx w paging-rxjava2 lub paging-rxjava3, musisz teraz oznaczyć użycia za pomocą @OptIn(ExperimentalCoroutinesApi::class) (Ib1f9d).

Poprawki błędów

  • Naprawiono błąd IndexOutOfBoundsException: Inconsistency detected, który czasami występował podczas korzystania z interfejsów API w wersji 2 DataSource za pomocą ścieżek zgodności.
  • Wywołania isInvalid podczas inicjowania DataSource, gdy są używane za pomocą ścieżek zgodności, są teraz prawidłowo uruchamiane w funkcji fetchDispatcher zamiast w głównym wątku. Rozwiązuje to problem IllegalStateException spowodowany dostępem do bazy danych w głównym wątku podczas korzystania z implementacji PagingSource biblioteki Room.

Wersja 3.0.0-alpha13

27 stycznia 2021 r.

Publikacja androidx.paging:paging-*:3.0.0-alpha13 Wersja 3.0.0-alpha13 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • PagingSource.getRefreshKey nie jest już opcjonalna, jest teraz funkcją abstrakcyjną bez domyślnej implementacji. Użytkownicy, którzy przenoszą dane, mogą nadal zwracać domyślną implementację, która po prostu zwraca null, ale getRefreshKey() powinna mieć rzeczywistą implementację zwracającą klucz na podstawie bieżącej pozycji przewijania użytkownika, która umożliwia wczytywanie stron wokół obszaru widocznego za pomocą PagingState.anchorPosition, jeśli to możliwe. (I4339a)
  • InvalidatingPagingSourceFactory ma teraz status klasy ostatecznej (Ia3b0a)
  • Umożliwia skonfigurowanie separatora końcowego (nagłówka / stopki) za pomocą dodatkowego opcjonalnego parametru SeparatorType. Dostępne są 2 opcje:
    • FULLY_COMPLETE – dotychczasowe działanie: przed dodaniem separatorów końcowych poczekaj, aż zarówno PagingSource, jak i RemoteMediator oznaczą endOfPaginationReached. Jeśli nie jest używany element RemoteMediator, stan zdalnego ładowania jest ignorowany. Jest to przydatne głównie wtedy, gdy chcesz wyświetlać separatory sekcji tylko wtedy, gdy sekcja jest w pełni załadowana, w tym pobrana ze zdalnego źródła, np. z sieci.
    • SOURCE_COMPLETE – oczekuj tylko, aż PagingSource oznaczy koniec paginacji, nawet jeśli używany jest RemoteMediator. Dzięki temu nagłówki i stopki są wyświetlane synchronicznie z początkowym wczytaniem, co zapobiega konieczności przewijania przez użytkowników w celu zobaczenia separatorów terminali. (Ibe993, b/174700218)

Poprawki błędów

  • Naprawiono rzadki wyciek pamięci, który występuje, gdy element PagingSource zostanie unieważniony, zanim element PageFetcher zdąży rozpocząć z niego wczytywanie. (I9606b, b/174625633)

Wersja 3.0.0-alpha12

13 stycznia 2021 r.

Publikacja androidx.paging:paging-*:3.0.0-alpha12 Wersja 3.0.0-alpha12 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • InvalidatingPagingSourceFactory nie jest już klasą abstrakcyjną, ponieważ nigdy nie miała żadnych metod abstrakcyjnych. (I4a8c4)
  • Dodano przeciążenie funkcji .cachedIn(), które w przypadku użytkowników Javy akceptuje ViewModel zamiast Lifecycle lub CoroutineScope. (I97d81, b/175332619)
  • Zezwól wywołującym w Javie na asynchroniczne korzystanie z operacji przekształcania PagingData, akceptując Executor w argumentach operatora przekształcania. Wszystkie operatory przekształcania -Sync nie mają już sufiksu -Sync, a użytkownicy Kotlin Coroutine będą musieli rozróżniać je, wywołując funkcję rozszerzenia, która akceptuje blok zawieszający. Wszystkie operatory przekształcania PagingData zostały przeniesione do rozszerzeń w statycznej klasie PagingDataTransforms. Użytkownicy Javy będą musieli wywoływać je za pomocą statycznych funkcji pomocniczych, np.PagingDataTransforms.map(pagingData, transform) W przypadku użytkowników języka Kotlin składnia jest taka sama, ale trzeba zaimportować funkcję. (If6885, b/172895919)

Poprawki błędów

  • Naprawiliśmy błąd polegający na tym, że funkcja RemoteMediator.load() nie była wywoływana podczas funkcji adapter.refresh(), jeśli osiągnięto już koniec paginacji.

Wersja 3.0.0-alpha11

16 grudnia 2020 roku

Publikacja androidx.paging:paging-*:3.0.0-alpha11 Wersja 3.0.0-alpha11 zawiera te zatwierdzenia.

Nowe funkcje

  • Dodaliśmy obsługę zapisanego stanu w przypadku tych podstawowych zastosowań (pełna obsługa, zwłaszcza w przypadku warstwowego źródła, jest nadal w trakcie opracowywania):
    • przepływ jest zapisywany w pamięci podręcznej, a aplikacja nie jest zamykana (np. przepływ jest zapisywany w pamięci podręcznej w modelu widoku, a aktywność jest odtwarzana w procesie);
    • źródło stronicowania jest uwzględniane, symbole zastępcze są włączone, a układ nie jest naprzemienny.

Zmiany w interfejsie API

  • PagingSource.getRefreshKey() to teraz stabilny interfejs API (I22f6f, b/173530980)
  • PagingSource.invalidate nie jest już funkcją otwartą. Jeśli chcesz otrzymywać powiadomienia o unieważnieniu, zamiast zastępować metodę invalidate, rozważ wywołanie metody registerInvalidatedCallback. (I628d9, b/173029013, b/137971356)
  • Klasa Pager ma teraz jeden eksperymentalny konstruktor obok zwykłych konstruktorów, zamiast udostępniać eksperymentalne interfejsy API w nieeksperymentalnym publicznym interfejsie API za pomocą adnotacji opt-in. (I9dc61, b/174531520)
  • Zaktualizowano właściwości wygody:CombinedLoadStates.refresh, CombinedLoadStates.prepend,CombinedLoadStates.append, aby przejście ze stanu Loading do NotLoading następowało tylko wtedy, gdy stany wczytywania zarówno pośrednika, jak i źródła są równe NotLoading. Dzięki temu zdalna aktualizacja zostanie zastosowana. (I65619)
  • Parametr LoadParams.pageSize został usunięty (był już wycofany). Zalecamy użycie LoadParams.loadSize w obiekcie PagingSource.

    LoadParams.loadSize jest zawsze równe PagingConfig.pageSize, z wyjątkiem wywołania wczytywania początkowego, w którym jest równe PagingConfig.initialLoadSize.

    Jeśli testujesz źródło danych Paging2 bez użycia klasy Pager lub PagedList, wartość pageSize może nie być zgodna z wartością PagingConfig.pageSize, jeśli ustawiasz też wartość initialLoadSize. Jeśli jest to ważne w przypadku Twoich testów, spróbuj użyć klasy Pager lub PagedList, która wewnętrznie ustawi prawidłową wartość PageSize dla metod wczytywania DataSource. (I98ac7, b/149157296)

Poprawki błędów

  • Rozwiązaliśmy problem z awarią spowodowaną przez wyjątek IllegalStateException podczas używania separatorów z ustawioną wartością PagingConfig.maxSize. (I0ed33, b/174787528)
  • Usunęliśmy błąd, który powodował, że stan wczytywania dla PREPEND / APPEND nie aktualizował się do NotLoading(endOfPaginationReached = true) natychmiast po początkowym wczytaniu, jeśli ustawiony był RemoteMediator (I8cf5a).
  • Naprawiliśmy błąd, który powodował, że interfejsy API po stronie prezentera, takie jak .snapshot(), .peek() itp., zwracały poprzednią (nieaktualną) listę w ramach aktualizacji ListUpdateCallback.
  • Naprawiono błąd, który powodował, że operatory Separators nie dodawały nagłówków ani stopek, gdy były używane z RemoteMediator.
  • Naprawiono błąd, który powodował, że aktualizacje LoadState do stanu NotLoading dla RemoteMediator utykały w stanie Loading.
  • Naprawiono błąd, w którym interfejs API zgodności Paging 2.0, .asPagingSourceFactory(), mógł powodować inicjowanie DataSource w nieprawidłowym elemencie CoroutineDispatcher. Rozwiązuje to problem z awarią i możliwymi przypadkami ANR, zwłaszcza w przypadku korzystania z obecnej implementacji PagingSource w bibliotece Room, która korzysta z tej ścieżki zgodności.

Wersja 3.0.0-alpha10

2 grudnia 2020 r.

Publikacja androidx.paging:paging-*:3.0.0-alpha10 Wersja 3.0.0-alpha10 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Wycofane interfejsy API dataRefreshFlowdataRefreshListener zostały usunięte, ponieważ są zbędne w przypadku aktualizacji loadStateFlow / Listener. W przypadku migracji odpowiednikiem loadStateFlow jest:

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

    (Ib5570, b/173530908)

Poprawki błędów

  • endOfPaginationReached w przypadku RemoteMediator REFRESH jest teraz prawidłowo propagowany do aktualizacji LoadState i zapobiega wywoływaniu zdalnych funkcji APPEND i PREPEND. (I94a3f, b/155290248)
  • Wyświetlanie pustej listy z powodu pustej strony początkowej lub intensywnego filtrowania nie będzie już uniemożliwiać rozpoczęcia wczytywania stron PREPEND ani APPEND. (I3e702, b/168169730)
  • Rozwiązaliśmy problem polegający na tym, że funkcja getRefreshKey nie była wywoływana w przypadku kolejnych generacji elementu PagingSource, gdy unieważnienia następowały szybko. (I45460, b/170027530)

Wkład zewnętrzny

  • Dodano nową klasę abstrakcyjną InvalidatingPagingSourceFactory z interfejsem API .invalidate(), który przekazuje unieważnienie do wszystkich obiektów PagingSource, które emituje. Dziękujemy @claraf3! (Ie71fc, b/160716447)

Znane problemy

  • Nagłówki i stopki z przekształcenia .insertSeparators() mogą nie pojawiać się od razu podczas korzystania z RemoteMediator b/172254056
  • Używanie RemoteMediator może spowodować zawieszenie zdalnego LoadState, jeśli unieważnienie i PagingSource.load(LoadParams.Refresh(...)) zakończą się przed zwróceniem przez RemoteMediator.load() wartości b/173717820

Wersja 3.0.0-alpha09

11 listopada 2020 roku

Publikacja androidx.paging:paging-*:3.0.0-alpha09 Wersja 3.0.0-alpha09 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Całkowite wycofanie metod dataRefreshFlow / Listener z klauzulą replaceWith. (I6e2dd)

Poprawki błędów

  • Poprawka błędu IllegalArgumentException występującego podczas używania separatorów z klasą RemoteMediator i wywoływania unieważnienia, gdy nadal trwa zdalne wczytywanie, które zwróciło endOfPagination (I3a260).

Wersja 3.0.0-alpha08

28 października 2020 r.

Publikacja androidx.paging:paging-*:3.0.0-alpha08 Wersja 3.0.0-alpha08 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Warianty DataSource.InvalidatedCallback w językach Kotlin i Java zostały połączone przez włączenie konwersji SAM w Kotlinie za pomocą interfejsu funkcyjnego (dostępnego w Kotlinie 1.4). Rozwiązuje to też błąd, który powodował, że warianty wywołań zwrotnych unieważniania w języku Kotlin nie były wywoływane po przekształceniu przez .map lub .mapByPage. (I1f244, b/165313046)

Poprawki błędów

  • Znacznie ulepszyliśmy interakcję biblioteki Paging z komponentem ViewPager. W szczególności funkcja stronicowania nie będzie już anulować połączenia RemoteMediator#load z powodu unieważnienia strony. Nie będzie też wysyłać żądania wstawienia na początku lub na końcu listy w przypadku konieczności odświeżenia, dopóki żądanie odświeżenia nie zostanie zrealizowane. (I6390b, b/162252536)
  • Sprawdzanie API lint pod kątem MissingGetterMatchingBuilder jest włączone w przypadku androidx (I4bbea, b/138602561).
  • Naprawiono błąd, w wyniku którego pomocnicy .withLoadState* ConcatAdapter ulegali awarii z powodu powiadamiania elementu RecyclerView z wątku w tle (I18bb5, b/170988309).
  • Naprawiliśmy błąd, który powodował, że wczytanie bardzo małej, niepustej strony czasami uniemożliwiało prawidłowe wywoływanie wczytywania przez wstępne pobieranie.Iffda3 b/169259468

Wersja 3.0.0-alpha07

1 października 2020 roku

Publikacja androidx.paging:paging-*:3.0.0-alpha07 Wersja 3.0.0-alpha07 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Operatory asynchronicznego stronicowania danych oparte na Guavie akceptują teraz parametr Executor, aby kontrolować kontekst wykonania. (Id4372)

Poprawki błędów

  • Rozwiązanie problemu z wyjątkiem IndexOutOfBounds zgłaszanym w klasie RemoteMediator z powodu sytuacji wyścigu. (I00b7f, b/165821814)
  • Naprawiliśmy sytuację wyścigu podczas konwersji DataSource -> PagingSource, która mogła powodować ignorowanie przez wynikowy obiekt PagingSource sygnałów unieważnienia z obiektu DataSource.
  • Rozwiązaliśmy problem w logice pobierania stron, który czasami powodował, że nowe generacje PagingSource nie były odbierane, dopóki nie została wywołana funkcja PagingDataAdapter.refresh().
  • Rozwiązaliśmy problem, który powodował, że pozycja przewijania była czasami tracona podczas korzystania ze źródła danych przekształconego w PagingSource (np. wygenerowanego przez Room) w połączeniu z RemoteMediator.

Wkład zewnętrzny

  • Dziękujemy @simonschiller za dodanie operatorów transformacji asynchronicznej opartych na RxJava2, RxJava3 i Guava dla PagingData.

Wersja 3.0.0-alpha06

2 września 2020 r.

Publikacja androidx.paging:paging-*:3.0.0-alpha06 Wersja 3.0.0-alpha06 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • UnsupportedOperationException z wyraźniejszymi komunikatami dotyczącymi braku obsługi stabilnych identyfikatorów jest teraz zgłaszany za każdym razem, gdy wywoływana jest funkcja PagingDataAdapter.setHasStableIds. (Ib3890, b/158801427)

Poprawki błędów

  • Funkcja insertSeparators nie odfiltrowuje już pustych stron, dzięki czemu odległość wstępnego pobierania jest uwzględniana przez prezenter nawet w przypadkach, gdy wstawianych jest wiele pustych stron. (I9cff6, b/162538908)

Wersja 3.0.0-alpha05

19 sierpnia 2020 r.

Publikacja androidx.paging:paging-*:3.0.0-alpha05 Wersja 3.0.0-alpha05 zawiera te zatwierdzenia.

Poprawki błędów

  • Stronicowanie teraz prawidłowo pobiera strony z wyprzedzeniem, nawet jeśli prezentowane dane są mocno filtrowane.
  • Przywracanie LoadResult.Error do ponownej próby wczytania nie powoduje już nieprawidłowego ponownego wywoływania ponownej próby dostępu do elementu.

Wkład zewnętrzny

  • Dziękujemy Clarze F. za pomoc w oczyszczeniu niektórych testów. (549612)

Wersja 3.0.0-alpha04

5 sierpnia 2020 r.

Publikacja androidx.paging:paging-*:3.0.0-alpha04 Wersja 3.0.0-alpha04 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Dodano interfejs peek() API do AsyncPagingDataDifferPagingDataAdapter, aby umożliwić dostęp do prezentowanych danych bez wczytywania strony wywołującej. (I38898, b/159104197)
  • Dodano interfejs API snapshot() do PagingDataAdapter i AsyncPagingDataDiffer, aby umożliwić pobieranie prezentowanych produktów bez wywoływania pobierania strony. (I566b6, b/159104197)
  • Dodano konstruktor PagingData.from(List<T>), który umożliwia prezentowanie statycznych list, które można łączyć z ogólnym przepływem PagingData, aby wyświetlać statyczne listy w określonych stanach, np. przed zakończeniem początkowego odświeżania lub po prostu w celu testowania przekształceń. (Id134d)
  • Wycofanie interfejsów API dataRefresh Flow / Listener, ponieważ miały one udostępniać stan prezentowanych elementów podczas odświeżania, ale dzięki ulepszeniom dotyczącym czasu wywołania zwrotnego loadState Flow / Listener i właściwości itemCount są one zbędne (Ia19f3).
  • Dodano otoczki zgodności RxJava3 dla PagingSourceRemoteMediator (I49ef3, b/161480176)

Poprawki błędów

  • PositionalDataSource przekonwertowane na PagingSource za pomocą toPagingSourceFactory, w tym PagingSource wygenerowane przez Room,PagingSource są teraz prawidłowo oznaczane jako obsługujące przeskakiwanie. (I3e84c, b/162161201)
  • Naprawiono błąd, który powodował, że użycie synchronicznej wersji funkcji submitData czasami prowadziło do wyścigu, co powodowało błąd ClosedSendChannelException (I4d702, b/160192222).

Wkład zewnętrzny

  • Dziękujemy Zacowi Sweersowi za dodanie w imieniu Slacka otoczek zgodności z RxJava3. (I49ef3, b/161480176)

Wersja 3.0.0-alpha03

22 lipca 2020 r.

Publikacja androidx.paging:paging-*:3.0.0-alpha03 Wersja 3.0.0-alpha03 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Konstruktor PagingState jest teraz publiczny, co powinno ułatwić testowanie implementacji funkcji getRefreshKey() (I8bf15).
  • Ukryto warianty funkcji mapowania Kotlin DataSource przed Javą, aby rozwiązać niejednoznaczność między wariantami oryginalnymi a wariantami Kotlin. (If7b23, b/161150011)
  • Nadmiarowe interfejsy API, które mają ułatwiać pracę użytkownikom języka Kotlin, zostały oznaczone adnotacją @JvmSynthetic (I56ae5).
  • Dodano przeciążenia konstruktora LoadResult.Page, które domyślnie ustawiają wartości itemsBefore i itemsAfter na COUNT_UNDEFINED (I47849).
  • Zmieniliśmy działanie operatorów PagingData, aby akceptowali metody zawieszające, i wprowadziliśmy nowe operatory mapSync, flatMapSync i filterSync, które nie zawieszają działania, dla użytkowników Javy. Dotychczasowe metody przekształcania zostały przeniesione do funkcji rozszerzeń, więc użytkownicy Kotlina będą musieli je teraz importować. (I34239, b/159983232)

Poprawki błędów

  • Źródła danych Room (i PositionalDataSource) PagingSources będą teraz wyświetlać separator początkowy jako część pierwszej strony, więc użytkownik nie będzie musiał przewijać, aby go zobaczyć. (I6f747, b/160257628)
  • Dostęp do elementów w miejscach zastępczych teraz prawidłowo wywołuje wczytywanie PagingSource, dopóki nie zostanie zwrócona strona, która spełnia żądany indeks po przekształceniu przez PagingData.filter() (I95625, b/158763195).
  • Naprawiliśmy błąd, który powodował, że przewijanie po zwróceniu błędu przez PagingSource czasami uniemożliwiało ponawianie próby przez PagingDataAdapter.retry(). (I1084f, b/160194384)
  • Rozwiązuje problem, który powodował, że po zamknięciu strony dostęp do elementu mógł nie powodować wczytywania stron, mimo że znajdował się w zakresie prefetchDistance (Ie95ae, b/160038730).
  • Ustawienie PagingConfig.maxSize nie włącza już symboli zastępczych po zdarzeniu upuszczania (I2be29, b/159667766)

Wersja 3.0.0-alpha02

24 czerwca 2020 r.

Publikacja androidx.paging:paging-*:3.0.0-alpha02 Wersja 3.0.0-alpha02 zawiera te zatwierdzenia.

Zmiany w interfejsie API

  • Dodano przeciążenia konstruktora PagingConfig z częstymi wartościami domyślnymi (I39c50, b/158576040)
  • Dodano przeciążenia konstruktorów klas PagingDataAdapterAsyncPagingDataDiffer z częstymi wartościami domyślnymi (Ie91f5).
  • Interfejsy API adaptera dataRefreshFlowdataRefreshListener przekazują teraz wartość logiczną, aby sygnalizować, czy PagingData jest pusty (I6e37e, b/159054196).
  • Dodano interfejsy API RxJava i Guava dla RemoteMediator – RxRemoteMediatorListenableFutureRemoteMediator
  • Dodano do klasy PagingState pomocnicze funkcje dostępu do elementów, takie jak isEmpty()firstItemOrNull() (I3b5b6, b/158892717).

Poprawki błędów

  • Biblioteka Pager sprawdza teraz, czy w fabryce nie jest ponownie używane źródło danych PagingSource. Zapobiega to przypadkowemu ponownemu użyciu nieprawidłowych źródeł danych PagingSource, które powodowały niejasny błąd (I99809, b/158486430).
  • Błędy podczas odświeżania RemoteMediator nie uniemożliwiają już ładowania PagingSource (I38b1b, b/158892717)
  • Wersja submitData, która nie wstrzymuje działania, nie powoduje już awarii z powodu jednoczesnego zbierania danych na wielu obiektach PagingData, gdy jest wywoływana po wersji submitData, która wstrzymuje działanie. (I26358, b/158048877)
  • Naprawiono wyjątek „cannot collect twice from pager”, który mógł wystąpić po zmianie konfiguracji (I58bcc, b/158784811).

Wersja 3.0.0-alpha01

10 czerwca 2020 r.

Publikacja androidx.paging:paging-*:3.0.0-alpha01 Wersja 3.0.0-alpha01 zawiera te zatwierdzenia.

Biblioteka Paging została zaktualizowana do wersji 3.0, aby umożliwić korzystanie z kilku ważnych nowych funkcji.

Nowe funkcje wersji 3.0

Znane problemy

  • Dokumentacja Javadoc biblioteki Paging 3 nie jest jeszcze dostępna. W międzyczasie skorzystaj z przewodników, do których linki znajdziesz powyżej, lub z dokumentacji języka Kotlin. (b/158614050)

Wersja 2.1.2

Wersja 2.1.2

18 marca 2020 r.

Publikacja androidx.paging:paging:2.1.2 Wersja 2.1.2 zawiera te zmiany w porównaniu z wersją 2.1.0.

Poprawki błędów

  • Poprawka dla IndexOutOfBoundsException w rzadkich przypadkach podczas konwersji pozycji w trakcie unieważniania.

Problem z wersją

  • Wersja stronicowania 2.1.1 została opublikowana nieprawidłowo z nieprawidłowo skonfigurowanej gałęzi, co spowodowało udostępnienie częściowo zaimplementowanych interfejsów API i funkcji, które mają się pojawić w przyszłej wersji.

  • Stronicowanie 2.1.2 zawiera poprawkę dotyczącą wyważania obciążenia, która została pierwotnie wydana w wersji 2.1.1, ale tym razem została prawidłowo wybrana z wersji 2.1.0. Jeśli korzystasz obecnie z wersji 2.1.1, zdecydowanie zalecamy przejście na tę wersję.

Wersja 2.1.1

Wersja 2.1.1

18 grudnia 2019 r.

Publikacja androidx.paging:paging-*:2.1.1 Wersja 2.1.1 zawiera te zmiany.

Poprawki błędów

  • Początkowe wczytywania z sąsiadujących ze sobą źródeł danych pozycyjnych są teraz wyśrodkowane wokół ostatniego dostępu, gdy wyłączone są elementy zastępcze.

Wersja 2.1.0

Wersja 2.1.0

25 stycznia 2019 r.

Strona 2.1.0 została opublikowana bez zmian w stosunku do strony 2.1.0-rc01.

Wersja 2.1.0-rc01

6 grudnia 2018 r.

Strona 2.1.0-rc01 została opublikowana bez zmian w stosunku do strony 2.1.0-beta01.

Wersja 2.1.0-beta01

1 listopada 2018 r.

Strona 2.1.0-beta01 została opublikowana bez zmian w stosunku do strony 2.1.0-alpha01.

Wersja 2.1.0-alpha01

12 października 2018 r.

Biblioteka Paging 2.1.0-alpha01 zawiera 2 główne dodatki: usuwanie stron i biblioteki rozszerzeń KTX dla każdego artefaktu, a także kilka innych zmian w interfejsie API i poprawek błędów.

Zmiany w interfejsie API

  • Dodano parametr PagedList.Config.Builder.setMaxSize(), który ogranicza liczbę wczytanych elementów w pamięci.
  • Dodano androidx.paging.Config() jako alternatywę dla PagedList.Config.Builder w języku Kotlin
  • Dodano androidx.paging.PagedList() jako alternatywę dla PagedList.Builder w języku Kotlin
  • Dodano DataSourceFactory.toLiveData() jako alternatywę dla LivePagedListBuilder w języku Kotlin
  • Dodano DataSourceFactory.toObservable() i toFlowable() jako alternatywne rozwiązania w języku Kotlin dla RxPagedListBuilder
  • Dodaliśmy AsyncPagedListDiffer.addPagedListListener() do nasłuchiwania, gdy lista PagedList jest zamieniana. b/111698609
  • Dodano PagedListAdapter.onCurrentListChanged() wariant, który przechodzi starą i nową listę, a poprzedni wariant został wycofany.
  • Dodano warianty PagedListAdapter/AsyncPagedListDiffer.submitList(), które przyjmują dodatkowe wywołanie zwrotne uruchamiane, gdy lista podzielona na strony jest wyświetlana po porównaniu różnic. Umożliwia to synchronizowanie zamiany obiektu PagedList z innymi aktualizacjami interfejsu. b/73781068
  • PagedList.getLoadedCount(), aby informować o liczbie elementów w pamięci. Pamiętaj, że jeśli symbole zastępcze są wyłączone, zwracana wartość jest zawsze równa .size().

Poprawki błędów

  • Naprawiono sytuację wyścigu podczas porównywania, czy listy są ponownie używane. b/111591017
  • PagedList.loadAround() teraz zgłasza IndexOutOfBoundsException, gdy indeks jest nieprawidłowy. Wcześniej mogło dojść do awarii z powodu innego, niejasnego wyjątku.
  • Rozwiązaliśmy problem, w którym bardzo mały początkowy rozmiar wczytywania w połączeniu z niezmienionymi danymi powodował brak dalszego wczytywania b/113122599

Wersja 2.0.0

Wersja 2.0.0

1 października 2018 r.

Stronicowanie 2.0.0 zostało wydane z jedną poprawką błędu.

Poprawki błędów

  • Naprawiono błąd, który mógł występować podczas bardzo szybkiego przewijania przy użyciu PositionalDataSource i symboli zastępczych b/114635383.

Wersja 2.0.0-beta01

2 lipca 2018 r.

Poprawki błędów

  • Naprawiono problem z znikaniem treści w niektórych przypadkach dodawania na początku (wyłączone symbole zastępcze, PositionalDataSource) b/80149146
  • (Wprowadzono już w 1.0.1) Naprawiliśmy awarie, w których PagedListAdapterAsyncPagedListDiffer nie sygnalizowały zdarzeń przeniesienia. b/110711937

Zależności sprzed AndroidaX

W przypadku wersji biblioteki Paging sprzed Androida X uwzględnij te zależności:

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

Wersja 1.0.1

Wersja 1.0.1

26 czerwca 2018 r.

Wersja 1.0.1 z jedną poprawką błędu została opublikowana w runtime. Ze względu na stabilność zdecydowanie zalecamy używanie 1.0.1. Wydana została też biblioteka Paging RxJava2 1.0.1, która jest identyczna z biblioteką 1.0.0-rc1.

Poprawki błędów

  • Rozwiązaliśmy problem z awariami, które występowały, gdy funkcje PagedListAdapterAsyncPagedListDiffer nie sygnalizowały zdarzeń przenoszenia. b/110711937

RxJava2 w wersji 1.0.0

RxJava2 w wersji 1.0.0-rc1

16 maja 2018 r.

Biblioteka Paging RxJava2 1.0.0-rc1 przechodzi do wersji kandydującej do publikacji bez zmian w stosunku do początkowej wersji alfa.

Wersja 1.0.0

Wersja 1.0.0-rc1

19 kwietnia 2018 r. Wersja kandydująca do publikacji dotycząca stronicowania

Nie mamy żadnych innych znanych problemów ani nowych funkcji zaplanowanych na wersję Paging 1.0.0. Przenieś swoje projekty na wyższy abonament, aby korzystać z 1.0.0-rc1, i pomóż nam przetestować tę usługę, abyśmy mogli udostępnić niezawodną 1.0.0.

W tej wersji nie wprowadzono żadnych zmian. Jest ona taka sama jak wersja 1.0.0-beta1.

Wersja 1.0.0-beta1

5 kwietnia 2018 r.

Paging będzie przez krótki czas w wersji beta, zanim przejdzie do wersji kandydującej do publikacji. Nie planujemy dalszych zmian w interfejsie API Paging 1.0, a wymagania dotyczące wszelkich zmian w interfejsie API są bardzo wysokie.

Wsparcie dla RxJava2 w bibliotece Paging w wersji alfa jest udostępniane jako osobny moduł opcjonalny (android.arch.paging:rxjava2:1.0.0-alpha1) i do czasu ustabilizowania będzie tymczasowo wersjonowane oddzielnie.

Ta nowa biblioteka stanowi alternatywę dla LivePagedListBuilder w RxJava2 i umożliwia tworzenie ObservableFlowable, przyjmując Scheduler zamiast 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();

Nowe funkcje

  • RxPagedListBuilder jest dodawany za pomocą nowego artefaktu android.arch.paging:rxjava2.

Zmiany w interfejsie API

  • Zmiany w interfejsie API, które wyjaśniają rolę wykonawców w kreatorach:

    • Zmieniono nazwę setBackgroundThreadExecutor() na setFetchExecutor() (w PagedList.BuilderLivePagedListBuilder)

    • Zmieniono nazwę setMainThreadExecutor() na setNotifyExecutor() (w PagedList.Builder).

  • Ustawiono PagedList.mCallbacks jako prywatny.

Poprawki błędów

  • LivePagedListBuilder wywołuje początkowe PagedList wczytywanie na określonym wykonawcy zamiast w puli wątków Arch Components IO.

  • Poprawiono działanie unieważniania w wewnętrznych otokach DataSource (używanych do implementowania DataSource.map, a także ładowania PositionalDataSource z wyłączonymi symbolami zastępczymi) b/77237534

Wersja 1.0.0-alpha7

21 marca 2018 r.

Wraz z funkcją Cykle życia 1.1.1 udostępniamy też stronicowanie 1.0.0-alpha7. Wersja Paging alpha7 zależy od przeniesienia wspomnianej powyżej klasy Function, dlatego musisz zaktualizować zależność lifecycle:runtime do wersji android.arch.lifecycle:runtime:1.1.1.

Wersja alpha7 ma być ostatnią przed wprowadzeniem paginacji w wersji beta.

Zmiany w interfejsie API

  • Obiekty DataSource.LoadParams mają teraz publiczny konstruktor, a obiekty DataSource.LoadCallback są teraz abstrakcyjne. Umożliwia to opakowanie elementu DataSource lub bezpośrednie testowanie elementu DataSource za pomocą wywołania zwrotnego.b/72600421
  • Mapery dla DataSource i DataSource.Factory
    • map(Function<IN,OUT>) umożliwia przekształcanie, opakowywanie lub dekorowanie wyników wczytanych przez DataSource.
    • mapByPage(<List<IN>,List<OUT>>) umożliwia to samo w przypadku przetwarzania wsadowego (np. jeśli elementy załadowane z SQL muszą dodatkowo wysyłać zapytania do oddzielnej bazy danych, można to zrobić w ramach przetwarzania wsadowego).
  • Dodano metodę pomocniczą PagedList#getDataSource(). b/72611341
  • Z interfejsu API usunięto wszystkie wycofane klasy, w tym pozostałości pakietu recyclerview.extensions i klasę LivePagedListProvider.
  • DataSource.Factory został zmieniony z interfejsu na klasę abstrakcyjną, aby umożliwić działanie funkcji mapy.

Poprawki błędów

  • Zmieniono klasy Builders na finalne. b/70848565
  • Implementacja biblioteki Room DataSource została poprawiona, aby obsługiwać zapytania dotyczące wielu tabel. Ta poprawka jest zawarta w bibliotece Room 1.1.0-beta1 (patrz wyżej).
  • Naprawiliśmy błąd, który powodował, że funkcja BoundaryCallback.onItemAtEndLoaded nie była wywoływana w przypadku funkcji PositionalDataSource, jeśli symbole zastępcze były włączone, a całkowity rozmiar był dokładną wielokrotnością rozmiaru strony.

Wersja 1.0.0-alpha5

22 stycznia 2018 r.

Poprawki błędów

  • Rozwiązywanie problemów z wczytywaniem strony, gdy wyłączone są symbole zastępcze b/70573345
  • Dodatkowe logowanie do śledzenia błędu IllegalArgumentException b/70360195 (i spekulacyjna poprawka po stronie Room)
  • Poprawki w przykładowym kodzie Javadoc b/70411933, b/71467637