Paging

Paging 라이브러리를 사용하면 앱의 RecyclerView 내 데이터를 점진적이고 매끄럽게 로드할 수 있습니다.

이 표에는 androidx.paging 그룹의 모든 아티팩트가 나열됩니다.

아티팩트 안정화 버전 출시 후보 버전 베타 버전 알파 버전
paging-* 3.3.5 - - -
paging-compose 3.3.5 - - -
이 라이브러리는 2024년 12월 11일에 최종 업데이트되었습니다.

종속 항목 선언

Paging에 종속 항목을 추가하려면 프로젝트에 Google Maven 저장소를 추가해야 합니다. 자세한 내용은 Google Maven 저장소를 읽어보세요.

다음과 같이 앱 또는 모듈의 build.gradle 파일에 필요한 아티팩트의 종속 항목을 추가합니다.

Groovy

dependencies {
  def paging_version = "3.3.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.3.2"
}

Kotlin

dependencies {
  val paging_version = "3.3.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.3.2")
}

Kotlin 확장 프로그램 사용에 관한 내용은 ktx 문서를 참고하세요.

종속 항목에 관한 자세한 내용은 빌드 종속 항목 추가를 참고하세요.

의견

제출하신 의견은 Jetpack을 개선하는 데 도움이 됩니다. 새로운 문제를 발견하거나 라이브러리 개선을 위한 아이디어가 있다면 Google에 알려 주세요. 새 문제를 제출하기 전에 이 라이브러리의 기존 문제를 살펴보시기 바랍니다. 별표 버튼을 클릭하여 기존 문제에 투표할 수 있습니다.

새로운 문제 제출하기

자세한 내용은 Issue Tracker 문서를 참고하세요.

버전 3.3

버전 3.3.5

2024년 12월 11일

androidx.paging:paging-*:3.3.5이 출시되었습니다. 버전 3.3.5에는 이 커밋이 포함되어 있습니다.

버그 수정

  • 사용자가 RecyclerView를 업데이트하는 동안 스크롤하면 RecyclerView에서 IndexOutOfBoundsException이 발생하는 버그가 수정되었습니다. (Id1f16, b/381024738)

버전 3.3.4

2024년 11월 13일

androidx.paging:paging-*:3.3.4이 출시되었습니다. 버전 3.3.4에는 이 커밋이 포함되어 있습니다.

버그 수정

  • Paging 3.3 이상을 가져오는 Android 단위 테스트에서 더 이상 Method isLoggable in android.util.Log not mocked과 같은 오류가 발생하지 않습니다. (Ia9400, b/331684448)

버전 3.3.2

2024년 8월 7일

androidx.paging:paging-*:3.3.2이 출시되었습니다. 버전 3.3.2에는 이 커밋이 포함되어 있습니다.

새로운 기능

  • paging-commonpaging-testing에 새로운 Kotlin 멀티플랫폼 타겟인 watchos, tvos, linuxArm64(90c9768), (53e0eca)가 추가되었습니다.

버전 3.3.1

2024년 7월 24일

androidx.paging:paging-*:3.3.1이 출시되었습니다. 버전 3.3.1에는 이 커밋이 포함되어 있습니다.

버그 수정

  • 스크롤 중에 백업 데이터 소스가 새로고침될 때 AsyncPagingDataDiffer 또는 RecyclerView와 함께 사용되는 PagingDataAdapter와 같이 AsyncPagingDataDiffer를 기반으로 빌드된 API에서 더 많은 로드를 트리거할 수 없는 문제를 수정했습니다. (I60ca5, b/352586078)
  • PagingDataAdapter 또는 AsyncPagingDataDiffer를 사용하여 RecyclerView를 스크롤하는 동안 백업 데이터 소스에서 항목이 삭제될 때 발생하는 비정상 종료를 수정했습니다. (I8c65a, b/347649763)

버전 3.3.0

2024년 5월 14일

androidx.paging:paging-*:3.3.0이 출시되었습니다. 버전 3.3.0에는 이러한 커밋이 포함되어 있습니다.

3.2.0 이후 중요 변경사항

  • PagingDataPresenter가 이제 공개 클래스입니다. 이제 내부 페이징 API 또는 paging-runtimeAsyncPagingDataDiffer가 필요하지 않고 PagingDataPresenter를 기반으로 멀티플랫폼 프레젠터를 빌드할 수 있습니다.
  • LoadStates가 각각 오류 상태 또는 NotLoading 상태인지 확인하는 새 LoadStatesCombinedLoadStates 도우미 메서드를 hasErrorisIdle에 추가했습니다. 또한 로드가 NotLoading 또는 오류 상태로 정착할 때까지 대기하는 새로운 awaitNotLoading() Kotlin 확장 메서드를 Flow<CombinedLoadStates>에 추가했습니다.
  • 이제 맞춤 LoadStates가 생성자에 전달되지 않는 한 PagingData.empty()는 기본적으로 NotLoading 상태를 전달합니다. 이는 PagingDataAdapter에 제출할 때 LoadStates를 전달하지 않거나 LazyPagingItems로 수집될 때 Loading 상태를 전달하는 기존 동작과 다릅니다. LazyPagingItems로 수집되면 이제 초기 구성 시 즉시 빈 목록도 표시됩니다.

Kotlin 멀티플랫폼 호환성

이제 페이징은 CashApp의 multiplatform-paging 프로젝트에서 업스트림된 작업 덕분에 Kotlin 멀티플랫폼과 호환되는 아티팩트를 제공합니다.

  • paging-common는 모든 Paging 3 API를 common로 이동했으며 이제 Android 외에도 jvm 및 iOS와 호환됩니다.
  • paging-testing가 코드를 common로 이전했으며 이제 Android 외에도 jvm 및 iOS와 호환됩니다.
  • paging-compose는 코드를 common로 이동하고 androidx.compose의 멀티플랫폼 지원과 일치하는 Android 아티팩트를 제공합니다.
  • paging-runtime, paging-guava, paging-rxjava2, paging-rxjava3는 Android 전용으로 유지됩니다.

버전 3.3.0-rc01

2024년 5월 1일

androidx.paging:paging-*:3.3.0-rc01이 Paging 3.3.0-beta01에서 변경사항 없이 출시되었습니다. 버전 3.3.0-rc01에는 이 커밋이 포함되어 있습니다.

버전 3.3.0-beta01

2024년 4월 3일

androidx.paging:paging-*:3.3.0-beta01이 출시되었습니다. 버전 3.3.0-beta01에는 이러한 커밋이 포함되어 있습니다.

버전 3.3.0-alpha05

2024년 3월 20일

androidx.paging:paging-*:3.3.0-alpha05이 출시되었습니다. 버전 3.3.0-alpha05에는 이러한 커밋이 포함되어 있습니다.

API 변경사항

  • 이제 페이징은 공통 코드에 AndroidX 주석 @MainThread 주석을 사용합니다. (I78f0d, b/327682438)

버전 3.3.0-alpha04

2024년 3월 6일

androidx.paging:paging-*:3.3.0-alpha04이 출시되었습니다. 버전 3.3.0-alpha04에는 이러한 커밋이 포함되어 있습니다.

버그 수정

  • Kotlin 멀티플랫폼 호환성 추가와 관련된 사소한 문서 오류가 수정되었습니다. (aosp/2950785)

버전 3.3.0-alpha03

2024년 2월 7일

androidx.paging:paging-*:3.3.0-alpha03이 출시되었습니다. 버전 3.3.0-alpha03에 포함된 커밋을 확인하세요.

새로운 기능

  • PagingDataPresenter가 이제 공개 클래스입니다. 이제 내부 페이징 API 또는 paging-runtimeAsyncPagingDataDiffer가 필요하지 않고 PagingDataPresenter를 기반으로 멀티플랫폼 프레젠터를 빌드할 수 있습니다. (Id1f74, b/315214786)
  • LoadStates가 오류 상태인지 NotLoading 상태인지 확인하는 새 LoadStatesCombinedLoadStates 도우미 메서드를 추가했습니다. 또한 부하가 NotLoading 또는 오류 상태로 안정될 때까지 LoadStateFlow에서 대기하는 새로운 API를 추가했습니다. (Id6c67)

동작 변경사항

  • 이제 맞춤 LoadStates가 생성자에 전달되지 않는 한 PagingData.empty()는 기본적으로 NotLoading 상태를 전달합니다. 이는 PagingDataAdapter에 제출할 때 LoadStates를 전달하지 않거나 LazyPagingItems로 수집될 때 Loading 상태를 전달하는 기존 동작과 다릅니다. LazyPagingItems로 수집되면 이제 초기 구성 시 즉시 빈 목록도 표시됩니다. (I4d11d, b/301833847)

버전 3.3.0-alpha02

2023년 9월 20일

androidx.paging:paging-*:3.3.0-alpha02이 출시되었습니다. 버전 3.3.0-alpha02에 포함된 커밋을 확인하세요.

Kotlin 멀티플랫폼 호환성

이제 페이징은 CashApp의 multiplatform-paging 프로젝트에서 업스트림된 작업 덕분에 Kotlin 멀티플랫폼과 호환되는 아티팩트를 제공합니다. 이렇게 하면 두 저장소 간의 불일치를 방지하고 호환성을 유지할 수 있습니다.

  • paging-common는 모든 Paging 3 API를 common로 이동했으며 이제 Android 외에도 jvm 및 iOS와 호환됩니다.
  • paging-testing가 코드를 common로 이전했으며 이제 Android 외에도 jvm 및 iOS와 호환됩니다.
  • paging-compose는 코드를 common로 이동하고 androidx.compose의 멀티플랫폼 지원과 일치하는 Android 아티팩트를 제공합니다.
  • paging-runtime, paging-guava, paging-rxjava2, paging-rxjava3는 Android 전용으로 유지됩니다.

API 변경사항

  • 내부용으로만 제공된 공개 Logger 인터페이스가 지원 중단되었습니다. (I16e95, b/288623117)

외부 기여

버전 3.3.0-alpha01

2023년 9월 20일

  • 이 버전은 androidx.paging 라이브러리의 첫 번째 멀티플랫폼 출시입니다. 이 버전에는 *-jvm*-android 아티팩트만 있습니다. macOS, iOS, Linux 변형의 경우 3.3.0-alpha02를 사용합니다.

버전 3.2

버전 3.2.1

2023년 9월 6일

androidx.paging:paging-*:3.2.1이 출시되었습니다. 버전 3.2.1에 포함된 커밋을 확인하세요.

버그 수정

  • asSnapshot() 오버로드와 달리 asSnapshot()에는 로드가 완료된 시점에 관한 정보가 없으므로 PagingData.from(List)를 사용하여 빌드된 Flow가 전달되면 페이징 테스트 아티팩트의 asSnapshot() API가 중단되는 문제가 수정되었습니다.PagingData.from(List, LoadStates) 이 해결 방법은 완료 가능한 Flow (예: flowOf(PagingData.from(...)))에만 작동합니다. 완료 불가능한 Flow (예: MutableStateFlow, LoadStates를 제공하는 PagingData.from 오버로드를 사용합니다. (I502c3)
  • 이제 Paging Compose는 내부적으로 AndroidUiDispatcher.Main를 사용하여 로드가 완료되는 것과 동일한 프레임에서 새 데이터를 사용할 수 있도록 합니다. (Ia55af)

버전 3.2.0

2023년 7월 26일

androidx.paging:paging-*:3.2.0이 출시되었습니다. 버전 3.2.0에 포함된 커밋을 확인하세요.

3.1.0 이후 중요 변경사항

  • Paging Compose가 API 안정성에 도달했으며 나머지 Paging에 다시 병합되어 이제 버전이 다른 모든 Paging 아티팩트와 일치합니다. 3.1.0 이후 변경사항은 다음과 같습니다.
    • PagingData.from(fakeData)를 만들고 이 PagingDataMutableStateFlow (예: MutableStateFlow(PagingData.from(listOf(1, 2, 3))))로 래핑하여 가짜 데이터 목록을 미리 보는 기능을 지원합니다. 이 흐름을 collectAsLazyPagingItems()가 미리 볼 수 있도록 수신기로 @Preview 컴포저블에 전달합니다.
    • LazyVerticalGridHorizontalPager와 같은 모든 지연 레이아웃과 Wear 및 TV 라이브러리의 맞춤 지연 구성요소를 지원합니다. 이는 새로운 하위 수준 LazyPagingItems 확장 메서드 itemKeyitemContentType를 통해 이루어졌으며, 이를 통해 LazyColumn, LazyVerticalGrid에 이미 존재하는 표준 items API에 keycontentType 매개변수를 구현할 수 있으며 HorizontalPager과 같은 API의 상응하는 매개변수도 구현할 수 있습니다.
    • LazyListScope만 지원하는 items(lazyPagingItems)itemsIndexed(lazyPagingItems)가 지원 중단되었습니다.
  • 앱의 각 레이어를 대상으로 단위 테스트를 진행하고 앱을 개별적으로 Paging과 통합하도록 설계된 API를 제공하는 새로운 paging-testing 아티팩트 예를 들면 다음과 같습니다.
    • TestPager 클래스를 사용하면 Pager 및 실제 UI와는 별개로 자체 맞춤 PagingSource 구현의 동작을 검증할 수 있습니다.
    • ​​asPagingSourceFactory API: Flow<List<Value>> 또는 정적 List<Value>를 테스트에서 Pager에 전달할 수 있는 PagingSourceFactory로 변환합니다.
    • Flow<PagingData<Value>>asSnapshot Kotlin 확장 프로그램은 Flow<PagingData<Value>>List<Value>로 직접 변환합니다. asSnapshot lambda를 사용하면 scrollTo 또는 appendScrollWhile과 같은 API를 통해 앱의 UI를 모방할 수 있으므로 페이징된 데이터의 어느 지점에서든 데이터의 스냅샷이 올바른지 확인할 수 있습니다.
  • VERBOSEDEBUG의 두 수준으로 페이징 디버깅 정보를 노출하는 기본 로그를 추가했습니다. 로그는 adb shell setprop log.tag.Paging [DEBUG|VERBOSE] 명령어를 통해 사용 설정할 수 있습니다. 이는 뷰를 사용한 페이징과 Compose를 사용한 페이징 모두에 적용됩니다.
  • CoroutineDispatcher 대신 CoroutineContext를 허용하는 PagingDataAdapterAsyncPagingDataDiffer의 생성자를 추가했습니다.
  • 이전의 () -> PagingSource 람다보다 더 명시적인 API 노출 영역을 제공하는 새로운 PagingSourceFactory 함수 인터페이스를 추가했습니다. 이 팩토리는 페이저를 인스턴스화하는 데 사용할 수 있습니다.

버전 3.2.0-rc01

2023년 6월 21일

androidx.paging:paging-*:3.2.0-rc01이 출시되었습니다. 버전 3.2.0-rc01에 포함된 커밋을 확인하세요.

외부 기여

  • 페이징을 Android/JVM 관련 사항에서 벗어나게 하는 데 기여해 주신 Veyndan님, 감사합니다. (#553, #554, #555, #559)

버전 3.2.0-beta01

2023년 6월 7일

androidx.paging:paging-*:3.2.0-beta01이 출시되었습니다. 버전 3.2.0-beta01에 포함된 커밋을 확인하세요.

Paging Compose

  • Paging Compose가 공식적으로 API 안정성에 도달했습니다. 따라서 버전이 1.0.0-alpha20에서 다른 모든 페이징 아티팩트의 버전과 일치하도록 업데이트되었습니다.

API 변경사항

버전 3.2.0-alpha06

2023년 5월 24일

androidx.paging:paging-*:3.2.0-alpha06이 출시되었습니다. 버전 3.2.0-alpha06에 포함된 커밋을 확인하세요.

새로운 기능

  • 기존 () -> PagingSource 람다보다 더 명시적인 API 노출 영역을 제공하는 새로운 PagingSourceFactory 함수 인터페이스를 추가했습니다. 이 팩토리는 Pager를 인스턴스화하는 데 사용할 수 있습니다. (I33165, b/280655188)
  • 변경 불가능한 데이터 목록에서만 로드되는 PagingSourceFactory를 가져오기 위한 List<Value>.asPagingSourceFactory()의 새 paging-testing API를 추가했습니다. 여러 세대의 정적 데이터를 사용한 테스트에는 Flow<List<Value>>의 기존 확장 프로그램을 계속 사용해야 합니다. (Id34d1, b/280655188)

API 변경사항

  • 이제 paging-testing의 모든 공개 API가 @VisibleForTesting로 주석 처리되어 이러한 API가 테스트에서만 사용되도록 합니다. (I7db6e)
  • asSnapshot API에 더 이상 CoroutineScope를 전달할 필요가 없습니다. 이제 기본적으로 상위 범위에서 상속된 컨텍스트를 사용합니다. (Id0a78, b/282240990)
  • 실제 Pager 생성자 매개변수의 순서와 직관적으로 일치하도록 TestPager 생성자 매개변수를 재정렬했습니다. (I6185a)
  • 페이징 테스트에서 람다 유형 () -> PagingSource<Key, Value>PagingSourceFactory<Key, Value> 유형으로 이전했습니다. (I4a950, b/280655188)

동작 변경사항

  • asSnapshot 페이징 테스트를 실행하는 데 더 이상 기본 디스패처가 필요하지 않습니다. 이 값을 설정해도 더 이상 테스트 동작이 변경되지 않습니다. (Ie56ea)

버전 3.2.0-alpha05

2023년 5월 3일

androidx.paging:paging-*:3.2.0-alpha05이 출시되었습니다. 버전 3.2.0-alpha05에 포함된 커밋을 확인하세요.

API 변경사항

  • 이제 asSnapshot의 페이징 테스트 API는 loadOperations 매개변수를 기본적으로 빈 람다로 설정합니다. 이렇게 하면 초기 새로고침 로드에서 데이터를 검색하기 위해 로드 작업을 전달하지 않고도 asSnapshot를 호출할 수 있습니다. (Ied354, b/277233770)

문서 개선사항

  • asPagingSourceFactory()PagingSource 인스턴스를 생성하기 위한 재사용 가능한 팩토리를 반환하는 Flow의 확장 메서드임을 명확히 하기 위해 asPagingSourceFactory()에 관한 문서를 업데이트했습니다. (I5ff4f, I705b5)
  • 점프를 지원하기 위해 itemsBeforeitemsAfter를 재정의해야 하는 필요성을 명확히 하기 위해 LoadResult.Page 생성자에 관한 문서를 업데이트했습니다. (Ied354)

외부 기여

버전 3.2.0-alpha04

2023년 2월 8일

androidx.paging:paging-*:3.2.0-alpha04가 출시되었습니다. 버전 3.2.0-alpha04에 포함된 커밋을 확인하세요.

Paging 테스트

  • 이제 paging-testing 아티팩트에는 Pager에 제공될 Flow<List<Value>>에서 pagingSourceFactory를 만드는 asPagingSourceFactory 메서드가 포함됩니다. Flow에서 내보낸 각 List<Value>>는 페이징된 데이터 생성을 나타냅니다. 예를 들면, 이를 통해 Pager에서 수집할 데이터 소스를 조작하여 PagingData 변환에 관한 페이징 테스트를 용이하게 합니다. (I6f230, b/235528239)
  • Flow<PagingData<T>>에 포함된 데이터가 올바른지 확인하는 데 적합한 새 API를 사용하여 paging-testing 아티팩트를 확장했습니다. 예를 들어, 확장된 아티팩트는 ViewModel 레이어에서 Flow<PagingData<T>>의 출력을 어설션하는 데 사용할 수 있습니다.

    이는 Flow<PagingData<Value>>asSnapshot Kotlin 확장 프로그램을 통해 이루어지며 Flow<PagingData<Value>>List<Value>로 직접 변환합니다. asSnapshot 람다를 사용하면 반복 가능하고 일관된 방식으로 scrollTo 또는 appendScrollWhile과 같은 API를 통해 앱의 UI를 모방할 수 있으므로 페이징된 데이터의 어느 지점에서든 데이터의 스냅샷이 올바른 것을 확인할 수 있습니다.

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

    asSnapshotrunTest 내에서 실행될 것으로 예상되는 suspend 메서드입니다. 자세한 내용은 Android에서 Kotlin 코루틴 테스트를 참고하세요. (I55fd2, I5bd26, I7ce34, I51f4d, I2249f, Id6223, Ic4bab, Ib29b9, Ic1238, I96def, b/235528239)

API 변경사항

  • 이제 AsyncPagingDataDifferPagingDataAdapter에서 getItempeek에 대한 UI 호출이 기본 스레드에서만 호출 가능한 것으로 올바르게 표시됩니다. (I699b6)
  • TestPager에서 사용하는 일반 유형에서 와일드 카드를 삭제하여 자바 프로그래밍 언어로 작성된 코드에서 이러한 메서드의 결과를 더 쉽게 사용할 수 있습니다. (I56c42)

버전 3.2.0-alpha03

2022년 10월 24일

androidx.paging:paging-*:3.2.0-alpha03이 출시되었습니다. 버전 3.2.0-alpha03에 포함된 커밋을 확인하세요.

Paging 테스트

이 버전에는 새로운 아티팩트 paging-testing이 포함되어 있습니다. 이 아티팩트는 앱의 각 레이어를 대상으로 단위 테스트를 진행하고 앱을 개별적으로 Paging과 통합하도록 설계된 API를 제공합니다.

예를 들어 이 첫 번째 버전에는 TestPager 클래스가 포함되어 있으며 이 클래스를 사용하면 엔드 투 엔드 Paging 통합을 시뮬레이션하는 데 일반적으로 필요한 Pager 및 실제 UI와는 별개로 자체 맞춤 PagingSource 구현의 동작을 검증할 수 있습니다.

TestPagerfake로 간주되어야 합니다. 이는 PagingSource를 테스트하기 위한 간소화된 API 노출 영역을 제공하는 동시에 Pager의 실제 구현을 미러링하는 테스트 더블입니다. 이러한 API는 suspend API이며 Android에서 Kotlin 코루틴 테스트 가이드에 설명된 대로 runTest 내에서 실행해야 합니다.

이러한 API의 사용 예는 room-paging 테스트에서 확인할 수 있습니다. 이 테스트는 TestPager를 사용하도록 리팩터링되었습니다.

API 변경사항

  • LoadResult.Page.iterator()를 통해 LoadResult.Page.data를 편리하게 반복할 수 있습니다. 이렇게 하면 PagingSource.getRefreshKey 메서드에 전달되는 PagingStatepages 속성과 같이 List<LoadResult.Page>가 제공될 때 Kotlin 표준 라이브러리 flatten 메서드를 간접적으로 사용할 수 있습니다. (Ie0718)

버전 3.2.0-alpha02

2022년 8월 10일

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)

버그 수정

  • 런타임 paging-runtime:3.1.1 이하에서 paging-common:3.2.0-alpha01을 사용할 때 누락되는 PagingDataDiffer 생성자 오류를 수정했습니다. (b/235256201)

버전 3.2.0-alpha01

2022년 6월 1일

androidx.paging:paging-*:3.2.0-alpha01이 출시되었습니다. 버전 3.2.0-alpha01에 포함된 커밋을 확인하세요.

API 변경사항

  • CoroutineDispatcher 대신 CoroutineContext를 허용하는 PagingDataAdapterAsyncPagingDataDiffer의 생성자를 추가했습니다. (Idc878)
  • 기본적으로 PagingData.from()PagingData.empty()가 발표자 측의 CombinedLoadStates에 더 이상 영향을 주지 않습니다. 이러한 생성자에 sourceLoadStatesremoteLoadStates 전달을 허용하는 새로운 오버로드가 추가되어 LoadStates를 완전한 터미널이 되도록 설정하는 기존 동작을 유지하며(즉, NotLoading(endOfPaginationReached = false)) 필요한 경우 원격 상태도 포함할 수 있는 옵션을 제공합니다. LoadStates가 전달되지 않으면 이전 CombinedLoadStates는 정적 PagingData를 수신할 때 발표자 측에서 유지됩니다. (Ic3ce5, b/205344028)

버그 수정

  • null이 반환되지만 null이 아닌 initialKey가 설정된 경우 이제 PagingSource.getRefreshKey()의 결과가 initialKey보다 제대로 우선하게 됩니다. (Ic9542, b/230391606)

외부 기여

  • test-coroutines-lib 이전으로 인해 :compose:ui:ui-test api(updateApi)가 업데이트되었습니다. (I3366d)

버전 3.1

버전 3.1.1

2022년 3월 9일

androidx.paging:paging-*:3.1.1이 출시되었습니다. 버전 3.1.1에 포함된 커밋을 확인하세요.

버그 수정

  • .cachedIn()에 의해 잘못 삽입된 세대 사이의 중간 LoadState.NotLoading 이벤트를 삭제했습니다. 이 변경사항을 통해 새로고침 시 또는 무효화하는 동안 실패한 로드를 재시도하는 사이에 생성된 중복 LoadState.NotLoading 이벤트를 삭제하여 LoadState 변경사항에 훨씬 더 쉽게 대응할 수 있습니다.

버전 3.1.0

2021년 11월 17일

androidx.paging:paging-*:3.1.0이 출시되었습니다. 버전 3.1.0에 포함된 커밋을 확인하세요.

3.0.0 이후 중요 변경사항

  • Flow<PagingData>.observableFlow<PagingData>.flowable API가 더 이상 실험용이 아닙니다.
  • LoadState의 동작 변경사항:
    • 이제 endOfPaginationReachedPagingSourceRemoteMediator 모두에서 LoadType.REFRESH의 값이 항상 false입니다.
    • 이제 Paging의 LoadStates가 다운스트림을 내보내기 전에 PagingSourceRemoteMediator에서 모두 유효한 값을 기다립니다. PagingData의 새로운 세대가 일부의 경우 NotLoading으로 잘못 재설정하는 대신 새로고침 상태에서 항상 Loading으로 올바르게 시작합니다.
    • presenter API의 .loadStateFlow.addLoadStateListener가 미디에이터 상태를 항상 null로 설정하는 초기 CombinedLoadStates를 더 이상 중복 전송하지 않습니다.
  • 이전 세대에 관한 취소가 이제 무효화/새로운 세대에서 발생합니다. Flow<PagingData>에서 .collectLatest를 더 이상 사용할 필요가 없지만 그래도 사용하는 편이 좋습니다.
  • PagingSource.LoadResult.InvalidPagingSource.load에서 새 반환 유형으로 추가되었으며, 이로 인해 Paging은 PagingSource에 관한 대기 중인 로드 요청 또는 향후 로드 요청을 삭제하고 무효화합니다. 이 반환 유형은 데이터베이스나 네트워크에서 반환될 수 있는 잠재적으로 무효하거나 오래된 데이터를 처리하도록 설계되었습니다.
  • 페이지가 UI에 표시될 때 동기식으로 트리거되는 .onPagesPresented.addOnPagesUpdatedListener presenter API를 추가했습니다. 다음과 같은 경우에 페이지 업데이트가 발생할 수 있습니다.
    • 표시된 항목에 관한 변경사항이 새로운 PagingData 세대에 있는지와 상관없이 이 새로운 세대가 초기 로드를 완료한 경우. 즉, 목록이 정확하게 동일하기 때문에 새로운 세대가 업데이트 없이 초기 로드를 완료하는 경우에도 이 콜백이 트리거됩니다.
    • 삽입된 페이지에 새 항목이 없더라도 페이지가 삽입된 경우 업데이트가 발생합니다.
    • 삭제된 페이지가 비어 있더라도 페이지가 삭제된 경우 업데이트가 발생합니다.

버전 3.1.0-rc01

2021년 11월 3일

androidx.paging:paging-*:3.1.0-rc01이 출시되었습니다. 버전 3.1.0-rc01에 포함된 커밋을 확인하세요.

버그 수정

  • 관찰자가 없는 동안 또는 관찰자가 새 PagingData로 전환하는 사이에 Paging 다운스트림에서 여러 로드 이벤트를 전송한 경우 .cachedIn()에서 발생하는 경합 상태와 메모리 누수가 해결되었습니다. (Ib682e)

버전 3.1.0-beta01

2021년 10월 13일

androidx.paging:paging-*:3.1.0-beta01이 출시되었습니다. 버전 3.1.0-beta01에 포함된 커밋을 확인하세요.

버그 수정

  • 많은 빠른 항목 액세스가 prefetchDistance의 고려사항에서 삭제되어 페이지 로드가 중단되는 문제를 수정했습니다. 이는 특히 많은 항목이 사용자 스크롤 방향을 대상으로 로드 우선순위를 정하는 순서로 한 번에 배치될 때 문제가 됩니다. 이러한 항목 액세스는 이제 버퍼링되고 동기식으로 우선순위가 정해져 삭제되지 않습니다. (aosp/1833273)

버전 3.1.0-alpha04

2021년 9월 29일

androidx.paging:paging-*:3.1.0-alpha04가 출시되었습니다. 버전 3.1.0-alpha04에 포함된 커밋을 확인하세요.

API 변경사항

  • Flow<PagingData>.observableFlow<PagingData>.flowable API가 더 이상 실험용이 아닙니다. (Ie0bdd)

버그 수정

  • LoadStates의 경우 endOfPaginationReached가 이제 LoadType.REFRESH에 항상 false입니다. 이전에는 endOfPaginationReached가 RemoteMediator REFRESH의 경우 true가 될 수 있었지만 PagingSource의 경우에는 true가 될 수 없었습니다. 이제 이 동작은 REFRESH가 종료되는 것이 적절하지 않으므로 항상 false를 반환하도록 통합되고 LoadStates에서 API 계약의 일부로 문서화됩니다. 페이지로 나누기가 종료되었는지 판단할 때는 항상 APPEND 또는 PREPEND 방향과 관련하여 판단해야 합니다. (I047b6)
  • 이제 Paging의 LoadStates가 세대 간 다운스트림을 내보내기 전에 PagingSource와 RemoteMediator에서 모두 유효한 값을 기다립니다. 이렇게 하면 새로운 PagingData 세대가 CombinedLoadStates.source.refresh에서 NotLoading을 전송할 수 없습니다(이미 로드 중인 경우). 새로운 PagingData 세대는 이제 일부의 경우 먼저 NotLoading으로 잘못 재설정하는 대신 새로고침 상태 로드를 항상 올바르게 시작합니다.

    이전 세대에 관한 취소가 이제 무효화/새로운 세대에서 발생합니다. Flow<PagingData>에서 .collectLatest를 더 이상 사용할 필요는 없지만 그래도 사용하는 편이 좋습니다. (I0b2b5, b/177351336, b/195028524)

  • presenter API의 .loadStateFlow.addLoadStateListener가 항상 미디에이터 상태를 null로, 소스 상태를 NotLoading(endOfPaginationReached = false)으로 설정하는 초기 CombinedLoadStates를 더 이상 중복 전송하지 않습니다. 이 내용의 의미는 다음과 같습니다.

    1. RemoteMediator를 사용하는 경우 미디에이터 상태가 항상 채워집니다.
    2. 새 loadState 리스너나 새 수집기를 .loadStateFlow에 등록하면 PagingData에서 실제 CombinedLoadStates를 받지 못한 경우 더 이상 현재 값을 즉시 내보내지 않습니다. 이는 PagingData가 제출되기 전에 수집기나 리스너가 시작되는 경우 발생할 수 있습니다. (I1a748)

버전 3.1.0-alpha03

2021년 7월 21일

androidx.paging:paging-*:3.1.0-alpha03이 출시되었습니다. 버전 3.1.0-alpha03에 포함된 커밋을 확인하세요.

API 변경사항

  • 세 번째 LoadResult 반환 유형 LoadResult.Invalid를 PagingSource에 추가합니다. PagingSource.load가 LoadResult.Invalid를 반환하면 페이징이 로드된 데이터를 삭제하고 PagingSource를 무효화합니다. 이 반환 유형은 데이터베이스나 네트워크에서 반환될 수 있는 잠재적으로 무효하거나 오래된 데이터를 처리하도록 설계되었습니다.

    예를 들어 기본 데이터베이스를 작성하지만 PagingSource가 제시간에 무효화되지 않는 경우, 구현이 로드하는 지원 데이터 세트의 불변성에 종속되면(예: LIMIT OFFSET 스타일 db 구현) 일관되지 않은 결과가 반환될 수 있습니다. 이 시나리오에서는 로드 후 무효화를 확인하고 LoadResult.Invalid를 반환하는 것이 좋습니다. 이렇게 하면 Paging에서 이 PagingSource에 관한 대기 중인 로드 요청 또는 향후 로드 요청을 삭제하고 무효화합니다.

    이 반환 유형은 LivePagedList나 RxPagedList를 활용하는 Paging2 API에서도 지원됩니다. Paging2의 PagedList API와 함께 PagingSource를 사용하면 PagedList가 즉시 분리되어 이 PagedList에서 데이터를 로드하려는 추가 시도를 중지하고 PagingSource에서 무효화를 트리거합니다.

    LoadResult는 봉인 클래스입니다. 즉, PagingSource.load 결과를 직접 사용하는 사용 사례에서 컴파일 시간에 LoadResult.Invalid를 처리해야 하는, 소스와 호환되지 않는 변경사항입니다. 예를 들어 exhaustive-when을 활용하여 반환 유형을 확인하는 Kotlin 사용자는 잘못된 유형 확인을 추가해야 합니다. (Id6bd3, b/191806126, b/192013267)

버그 수정

  • PagingSource.registerInvalidatedCallback이나 DataSource.addInvalidatedCallback을 통해 추가된 무효화 콜백이 이미 무효화된 PagingSource/DataSource에 등록된 경우 이제 자동으로 트리거됩니다. 이렇게 하면 초기 로드 중에 이미 무효화된 소스가 제공될 때 Paging이 무효화 신호를 삭제하고 중단되는 경합 상태가 해결됩니다. 또한 무효화 콜백이 최대 한 번 호출되는 것이 보장되므로 이제 트리거된 후 올바르게 삭제됩니다. (I27e69)
  • 새로 인스턴스화된 PagedList 스트림(예: LivePagedListBuilder 또는 RxPagedListBuilder)에서 자리표시자 초깃값(InitialPagedList)을 제출하면 더 이상 이전에 로드된 데이터가 삭제되지 않습니다.

버전 3.1.0-alpha02

2021년 7월 1일

androidx.paging:paging-*:3.1.0-alpha02가 출시되었습니다. 버전 3.1.0-alpha02에 포함된 커밋을 확인하세요.

새로운 기능

  • 표시된 페이지가 UI에서 업데이트되는 즉시 트리거되는 flow presenter API와 onPagesPresent 리스너를 추가했습니다.

    이러한 업데이트는 UI와 동기식이므로 업데이트가 적용된 후 .snapshot, .getItemCount 같은 어댑터 메서드를 호출하여 상태를 검사할 수 있습니다. 매 업데이트 시 이 작업을 하기에는 비용이 많이 들 수 있기 때문에 .snapshot()은 명시적으로 호출된 상태로 유지되었습니다.

    다음과 같은 경우에 페이지 업데이트가 발생할 수 있습니다.

    • 표시된 항목에 관한 변경사항이 새로운 PagingData 세대에 있는지와 상관없이 이 새로운 세대가 초기 로드를 완료한 경우. 즉, 목록이 정확하게 동일하기 때문에 새로운 세대가 업데이트 없이 초기 로드를 완료하는 경우에도 이 콜백이 트리거됩니다.
    • 삽입된 페이지에 새 항목이 없음에도 페이지가 삽입된 경우
    • 삭제된 페이지가 비어 있음에도 페이지가 삭제된 경우 (I272c9, b/189999634)

버그 수정

  • LivePagedList 또는 RxPagedList에서 생성된 초깃값에서 PagedList.dataSource에 액세스할 때 더 이상 IllegalStateException이 잘못 발생하지 않습니다. (I96707)

버전 3.1.0-alpha01

2021년 6월 2일

androidx.paging:paging-*:3.1.0-alpha01이 출시되었습니다. 버전 3.1.0-alpha01에 포함된 커밋을 확인하세요.

API 변경사항

  • 이제 paging-rxjava3에서 제공하는 클래스가 androidx.paging.rxjava3 패키지 아래에 위치하여 paging-rxjava2와 충돌하지 않습니다. (Ifa7f6)

버그 수정

  • Paging이 가끔 노옵스(no-ops) differ 이벤트를 RecyclerView로 보내 특정 리스너의 조기 트리거를 야기했던 문제를 해결했습니다. (Ic507f, b/182510751)

외부 기여

  • 지원 중단된 PagedList compat API를 rxjava3 아티팩트에 추가했습니다. (Id1ce2, b/182497591)

Paging Compose 버전 1.0.0

버전 1.0.0-alpha20

2023년 5월 24일

androidx.paging:paging-compose:1.0.0-alpha20이 출시되었습니다. 버전 1.0.0-alpha20에 포함된 커밋을 확인하세요.

새로운 기능

  • 이제 Paging Compose에서 PagingData.from(fakeData)를 만들고 PagingDataMutableStateFlow로 래핑하여 가짜 데이터 목록을 미리 볼 수 있습니다 (예: MutableStateFlow(PagingData.from(listOf(1, 2, 3)))). 이 데이터를 @Preview의 입력으로 사용하면 collectAsLazyPagingItems() 호출이 미리 볼 수 있는 LazyPagingItems를 제공합니다. (I8a78d, b/194544557)

버그 수정

  • LazyPagingItems에서 수집된 pager.flow.cachedIn의 캐시된 데이터는 이제 비동기 수집 없이 상태 복원 후 즉시 사용할 수 있습니다. 즉, 상태가 복원된 후 초기 컴포지션이 완료되는 즉시 캐시된 데이터를 표시할 수 있습니다. (I97a60, b/177245496)

버전 1.0.0-alpha19

2023년 5월 3일

androidx.paging:paging-compose:1.0.0-alpha19이 출시되었습니다. 버전 1.0.0-alpha19에 포함된 커밋을 확인하세요.

모든 지연 레이아웃 지원

이전에는 Paging Compose가 LazyListScope에 맞춤 itemsitemsIndexed 확장 프로그램을 제공했습니다. 즉, Paging Compose를 LazyVerticalGrid, HorizontalPager과 같은 다른 지연 레이아웃이나 Wear 및 TV 라이브러리에서 제공하는 기타 맞춤 지연 구성요소와 함께 사용할 수 없었습니다. 이 유연성 부족을 해결하는 것이 이번 출시의 주요 업데이트입니다.

더 많은 지연 레이아웃을 지원하려면 다른 레이어에서 API를 빌드해야 했습니다. 이제 Paging Compose는 지연 레이아웃마다 맞춤 items API를 제공하는 대신 itemKeyitemContentTypeLazyPagingItems에서 약간 낮은 수준의 확장 메서드를 제공합니다. 이러한 API는 LazyColumn, LazyVerticalGrid에 이미 존재하는 표준 items API와 HorizontalPager와 같은 API의 이에 상응하는 항목에 keycontentType 매개변수를 구현하는 데 중점을 둡니다. (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를 사용하는 다른 예는 샘플을 참고하세요.

이러한 변경사항으로 인해 LazyColumnLazyRow 예시가 몇 줄 더 길어지긴 하지만 앞으로 Paging Compose를 사용하는 사용자에게는 모든 지연 레이아웃의 일관성이 중요한 요소라고 생각했습니다. 따라서 LazyListScope의 기존 확장 프로그램은 지원 중단되었습니다. (I0c459, I92c8f, b/276989796)

API 변경사항

  • 새 API로의 이전을 쉽게 하기 위해 이제 LazyListScopeitemsitemsIndexed 확장 함수가 새 API의 지원을 반영하여 contentType 매개변수를 지원합니다. (Ib1918, b/255283378)

종속 항목 업데이트

  • Paging Compose의 종속 항목이 Compose 1.0.5에서 Compose 1.2.1로 업데이트되었습니다. (Ib1918, b/255283378)

버전 1.0.0-alpha18

2023년 2월 8일

androidx.paging:paging-compose:1.0.0-alpha18은 변경사항 없이 출시되었습니다. 버전 1.0.0-alpha18에 포함된 커밋을 확인하세요.

버전 1.0.0-alpha17

2022년 10월 24일

androidx.paging:paging-compose:1.0.0-alpha17이 출시되었습니다. 버전 1.0.0-alpha17에 포함된 커밋을 확인하세요.

새로운 기능

버전 1.0.0-alpha16

2022년 8월 10일

androidx.paging:paging-compose:1.0.0-alpha16이 출시되었습니다. 버전 1.0.0-alpha16에 포함된 커밋을 확인하세요.

새로운 기능

  • 이제 Paging이 LazyPagingItems 클래스를 통해 로그를 제공하여 PagingData에서 수집된 디버깅 정보를 노출합니다.
  • 로그는 adb shell 명령어 adb shell setprop log.tag.Paging [DEBUG|VERBOSE]을 통해 사용 설정할 수 있습니다([b/235527159}(https://issuetracker.google.com/issues/235527159)).

버그 수정

  • paging-common:3.1.1 이하에서 paging-compose:1.0.0-alpha15를 사용할 때 누락되는 PagingDataDiffer 생성자 오류를 수정했습니다(b/235256201,b/239868768).

버전 1.0.0-alpha15

2022년 6월 1일

androidx.paging:paging-compose:1.0.0-alpha15가 출시되었습니다. 버전 1.0.0-alpha15에 포함된 커밋을 확인하세요.

API 변경사항

  • CoroutineDispatcher 대신 CoroutineContext를 허용하는 PagingDataAdapterAsyncPagingDataDiffer의 생성자를 추가했습니다. (Idc878)

버그 수정

  • 이제 LazyPagingItems가 초기 loadStateLoadState.Loading 새로고침을 갖도록 설정합니다. (I55043, b/224855902)

버전 1.0.0-alpha14

2021년 10월 13일

androidx.paging:paging-compose:1.0.0-alpha14가 출시되었습니다. 버전 1.0.0-alpha14에 포함된 커밋을 확인하세요.

버전 1.0.0-alpha13

2021년 9월 29일

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

2021년 7월 21일

androidx.paging:paging-compose:1.0.0-alpha12가 출시되었습니다. 버전 1.0.0-alpha12에 포함된 커밋을 확인하세요.

API 변경사항

  • Paging을 LazyColumn/Row와 연결하는 데 사용된 items(lazyPagingItems)itemsIndexed(lazyPagingItems)가 이제 항목을 나타내는 안정적인 키를 지정할 수 있는 옵션 키 매개변수를 허용합니다. 키에 관한 자세한 내용은 여기를 참고하세요. (I7986d)
  • lazyPagingItems.getAsState(index) 함수가 이제 지원 중단됩니다. 대신 lazyPagingItems[index]를 사용합니다. (I086cb, b/187339372)

버전 1.0.0-alpha11

2021년 6월 30일

androidx.paging:paging-compose:1.0.0-alpha11이 출시되었습니다. 버전 1.0.0-alpha11에 포함된 커밋을 확인하세요.

버전 1.0.0-alpha10

2021년 6월 2일

androidx.paging:paging-compose:1.0.0-alpha10이 출시되었습니다. 버전 1.0.0-alpha10에 포함된 커밋을 확인하세요.

버전 1.0.0-alpha09

2021년 5월 18일

androidx.paging:paging-compose:1.0.0-alpha09가 출시되었습니다. 버전 1.0.0-alpha09에 포함된 커밋을 확인하세요.

버그 수정

  • 이제 LazyPagingItems의 itemCount와 item getter를 관측할 수 있으므로 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

2021년 2월 24일

androidx.paging:paging-compose:1.0.0-alpha08이 출시되었습니다. 버전 1.0.0-alpha08에 포함된 커밋을 확인하세요.

Compose 1.0.0-beta01과 통합되도록 업데이트되었습니다.

버전 1.0.0-alpha07

2021년 2월 10일

androidx.paging:paging-compose:1.0.0-alpha07이 출시되었습니다. 버전 1.0.0-alpha07에 포함된 커밋을 확인하세요.

Compose alpha12와 통합되도록 업데이트되었습니다.

버전 1.0.0-alpha06

2021년 1월 28일

androidx.paging:paging-compose:1.0.0-alpha06이 출시되었습니다. 버전 1.0.0-alpha06에 포함된 커밋을 확인하세요.

버그 수정

Compose 1.0.0-alpha11에 따라 업데이트되었습니다.

버전 1.0.0-alpha05

2021년 1월 13일

androidx.paging:paging-compose:1.0.0-alpha05가 출시되었습니다. 버전 1.0.0-alpha05에 포함된 커밋을 확인하세요.

Compose 1.0.0-alpha10에 종속되도록 업데이트되었습니다.

버전 1.0.0-alpha04

2020년 12월 16일

androidx.paging:paging-compose:1.0.0-alpha04가 출시되었습니다. 버전 1.0.0-alpha04에 포함된 커밋을 확인하세요.

버그 수정

  • 미디에이터 및 소스 로드 상태가 모두 NotLoading이 된 이후에만 편의성 속성 CombinedLoadStates.refresh, CombinedLoadStates.prepend, CombinedLoadStates.appendLoading에서 NotLoading으로 전환되어 원격 업데이트가 적용될 수 있도록 업데이트되었습니다. (I65619)

버전 1.0.0-alpha03

2020년 12월 2일

androidx.paging:paging-compose:1.0.0-alpha03이 출시되었습니다. 버전 1.0.0-alpha03에 포함된 커밋을 확인하세요.

  • Compose 1.0.0-alpha08과 일치하도록 업데이트되었습니다.

버전 1.0.0-alpha02

2020년 11월 11일

androidx.paging:paging-compose:1.0.0-alpha02가 출시되었습니다. 버전 1.0.0-alpha02에 포함된 커밋을 확인하세요.

API 변경사항

  • AsyncPagingDataDiffer/PagingDataAdapter에서 사용할 수 있는 동일한 기능을 노출하는 LazyPagingItem.peek(), .snapshot(), .retry(), .refresh() 메서드를 추가했습니다. (Iddfe8, b/172041660)

버전 1.0.0-alpha01

2020년 10월 28일

androidx.paging:paging-compose:1.0.0-alpha01이 출시되었습니다. 버전 1.0.0-alpha01에 포함된 커밋을 확인하세요.

새로운 기능

paging-compose 아티팩트는 Paging 라이브러리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

2021년 7월 21일

androidx.paging:paging-*:3.0.1이 출시되었습니다. 버전 3.0.1에 포함된 커밋을 확인하세요.

버그 수정

  • LivePagedListRxPagedList로 생성된 초깃값에서 PagedList.dataSource에 액세스할 때 더 이상 IllegalStateException이 잘못 발생하지 않습니다. (I96707)

버전 3.0.0

버전 3.0.0

2021년 5월 5일

androidx.paging:paging-*:3.0.0이 출시되었습니다. 버전 3.0.0에 포함된 커밋을 확인하세요.

3.0.0의 주요 기능

Paging 2.x.x의 기존 API 대부분을 지원 중단하고 새 Paging 3 API로 대체하여 다음과 같이 개선했습니다.

  • Kotlin 코루틴 및 Flow를 위한 최고 수준의 지원 제공
  • 취소 지원
  • 내장 로드 상태 및 오류 신호
  • 재시도 및 새로고침 기능
  • DataSource 서브클래스 세 개를 모두 통합 PagingSource 클래스로 결합
  • 구분자를 추가하기 위한 기본 제공 변환이 포함된 맞춤 페이지 변환
  • 상태 헤더 및 바닥글 로드

버전 3.0.0-rc01

2021년 4월 21일

androidx.paging:paging-*:3.0.0-rc01이 출시되었습니다. 버전 3.0.0-rc01에 포함된 커밋을 확인하세요.

버그 수정

  • Paging이 가끔 노옵스(no-ops) differ 이벤트를 RecyclerView로 보내 특정 리스너의 조기 트리거를 야기했던 문제를 해결했습니다. (Ic507f, b/182510751)

버전 3.0.0-beta03

2021년 3월 24일

androidx.paging:paging-*:3.0.0-beta03이 출시되었습니다. 버전 3.0.0-beta03에 포함된 커밋을 확인하세요.

버그 수정

  • RecyclerView에서 예기치 않은 점프를 방지하기 위해 목록이 새로고침될 때 자리표시자가 처리되는 방식이 개선되었습니다. 자세한 내용은 NullPaddedDiffing.md를 참고하세요. (If1490, b/170027529, b/177338149)
  • .build()가 호출될 때 다양한 PagedList 빌더(이전 호환성 경로)가 더 이상 기본 스레드에서 동기식으로 DataSource.Factory.create()를 잘못 호출하지 않습니다. (b/182798948)

버전 3.0.0-beta02

2021년 3월 10일

androidx.paging:paging-*:3.0.0-beta02가 출시되었습니다. 버전 3.0.0-beta02에 포함된 커밋을 확인하세요.

API 변경사항

  • 이제 Rx3 확장이 @ExperimentalCoroutinesApi 선택 요구사항을 올바르게 전파합니다. 이전에는 @get 메서드에 표시되었으며, 이 메서드는 https://youtrack.jetbrains.com/issue/KT-45227에 설명된 문제로 인해 Kotlin 컴파일러에서 무시합니다. (I5733c)

버그 수정

  • 실험용 API의 공개 사용에 제한을 적용합니다. (I6aa29, b/174531520)
  • 원격 새로고침을 호출할 때 PagingState가 항상 null이 되는 버그를 수정했습니다.
  • PagingSource가 반환하는 빈 페이지에서 Paging '중단'을 일으키는 prefetchDistance를 처리하고자 다시 Paging을 가져오는 작업을 차단할 수 있는 버그를 수정했습니다.

버전 3.0.0-beta01

2021년 2월 10일

androidx.paging:paging-*:3.0.0-beta01이 출시되었습니다. 버전 3.0.0-beta01에 포함된 커밋을 확인하세요.

API 변경사항

  • 이제 Rx2 및 Rx3 래퍼가 종속 대상의 실험용 주석을 노출합니다. paging-rxjava2 또는 paging-rxjava3에서 Rx compat 래퍼를 사용하는 경우 이제 @OptIn(ExperimentalCoroutinesApi::class)으로 사용에 관해 주석을 달아야 합니다. (Ib1f9d)

버그 수정

  • 호환성 경로를 통해 v2 DataSource API를 사용할 때 가끔 발생하는 IndexOutOfBoundsException: Inconsistency detected 문제를 해결했습니다.
  • DataSource 초기화 중에 isInvalid 호출이 호환성 경로를 통해 사용될 때 이제 기본 스레드가 아닌 fetchDispatcher에서 올바르게 실행됩니다. 이는 Room의 PagingSource 구현을 사용할 때 기본 스레드의 Db 액세스로 인해 발생하는 IllegalStateException 문제를 해결합니다.

버전 3.0.0-alpha13

2021년 1월 27일

androidx.paging:paging-*:3.0.0-alpha13이 출시되었습니다. 버전 3.0.0-alpha13에 포함된 커밋을 확인하세요.

API 변경사항

  • PagingSource.getRefreshKey는 더 이상 구현 가능한 옵션이 아닙니다. 이제 이 함수는 기본 구현이 없는 추상 함수입니다. 사용자를 이전하면 간단히 null을 반환하여 이전 구현을 계속 반환할 수 있지만, 가능한 경우 Paging이 PagingState.anchorPosition을 통해 표시 영역을 중심으로 계속 로드할 수 있도록 사용자의 현재 스크롤 위치에 기반한 키를 반환하는 실제 구현이 getRefreshKey()에 있어야 합니다. (I4339a)
  • InvalidatingPagingSourceFactory는 이제 최종 클래스입니다. (Ia3b0a)
  • 추가 옵션으로 SeparatorType 매개변수를 사용하여 터미널 구분자(헤더/바닥글) 동작을 구성할 수 있습니다. 다음과 같은 두 가지 옵션이 있습니다.
    • FULLY_COMPLETE - 기존 동작. 터미널 구분자를 추가하기 전에 endOfPaginationReached를 표시하도록 PagingSource와 RemoteMediator를 모두 기다립니다. RemoteMediator가 사용되지 않는다면 원격 loadState는 무시됩니다. 이는 주로 원격 소스(예: 네트워크)에서 가져오기를 비롯하여 섹션이 완전히 로드될 때만 섹션 구분자를 표시하려는 경우에 유용합니다.
    • SOURCE_COMPLETE - RemoteMediator가 사용되더라도 endOfPaginationReached를 표시하도록 PagingSource만 기다립니다. 이렇게 하면 헤더와 바닥글이 초기 로드와 동기화되어 표시되므로 사용자가 터미널 구분자를 보기 위해 스크롤할 필요가 없습니다. (Ibe993, b/174700218)

버그 수정

  • PageFetcher가 PagingSource에서 로드를 시작하기도 전에 PagingSource가 무효가 되는 경우 드물게 발생하던 메모리 누수를 수정했습니다. (I9606b, b/174625633)

버전 3.0.0-alpha12

2021년 1월 13일

androidx.paging:paging-*:3.0.0-alpha12가 출시되었습니다. 버전 3.0.0-alpha12에 포함된 커밋을 확인하세요.

API 변경사항

  • InvalidatingPagingSourceFactory는 추상 메서드를 보유하지 않으므로 더 이상 추상 클래스가 아닙니다. (I4a8c4)
  • 자바 사용자를 위해 Lifecycle 또는 CoroutineScope 대신 ViewModel을 허용하는 .cachedIn()의 오버로드를 추가했습니다. (I97d81, b/175332619)
  • Executor를 변환 연산자 인수로 사용하는 것을 허용하여 자바 호출자에서 비동기 방식으로 PagingData 변환 작업을 사용할 수 있습니다. 모든 -Sync 변환 연산자는 이제 -Sync 접미사가 삭제되었으며 Kotlin 코루틴 사용자는 대신 정지 블록을 허용하는 확장 함수를 호출하여 명확하게 구분해야 합니다. 모든 PagingData 변환 연산자는 정적 PagingDataTransforms 클래스 아래의 확장 함수로 이동했습니다. 자바 사용자는 정적 도우미 메서드를 통해 연산자를 호출해야 합니다(예: PagingDataTransforms.map(pagingData, transform)). Kotlin 사용자의 경우 구문은 동일하지만, 함수를 가져와야 합니다. (If6885, b/172895919)

버그 수정

  • 페이지로 나누기 끝에 이미 도달한 경우 adapter.refresh() 중에 RemoteMediator.load()가 호출되지 않는 버그를 수정했습니다.

버전 3.0.0-alpha11

2020년 12월 16일

androidx.paging:paging-*:3.0.0-alpha11이 출시되었습니다. 버전 3.0.0-alpha11에 포함된 커밋을 확인하세요.

새로운 기능

  • 다음 기본 사용 사례를 위한 저장된 상태 지원이 추가되었습니다. 완전한 지원(특히 계층화된 소스 사례에서의 지원)은 아직 준비 중입니다.
    • 흐름이 캐시되고 애플리케이션이 중단되지 않습니다(예: 흐름이 보기 모델에 캐시되고 활동이 프로세스 내에서 다시 생성됨).
    • 페이징 소스가 집계되고 자리표시자가 사용 설정되며 레이아웃에 시차가 발생하지 않습니다.

API 변경사항

  • PagingSource.getRefreshKey()는 이제 안정적인 API입니다. (I22f6f, b/173530980)
  • PagingSource.invalidate는 더 이상 공개 함수가 아닙니다. 무효화가 발생할 때 알림을 받아야 하는 경우 무효화를 재정의하는 대신 registerInvalidatedCallback 메서드를 호출하는 것을 고려하세요. (I628d9, b/173029013, b/137971356)
  • 이제 Pager는 일반 생성자와 함께 하나의 실험 생성자를 보유하며 선택 주석을 통해 실험용 API를 비실험용 공개 API에 유출하지 않습니다. (I9dc61, b/174531520)
  • 미디에이터 및 소스 로드 상태가 모두 NotLoading이 된 이후에만 편의성 속성 CombinedLoadStates.refresh, CombinedLoadStates.prepend, CombinedLoadStates.appendLoading에서 NotLoading으로 전환되어 원격 업데이트가 적용될 수 있도록 업데이트되었습니다. (I65619)
  • LoadParams.pageSize가 삭제되었습니다(이미 지원 중단됨). PagingSource에 LoadParams.loadSize를 사용하는 것이 좋습니다.

    LoadParams.loadSize는 항상 PagingConfig.pageSize와 같습니다. 단, 초기 로드 호출은 예외이며 PagingConfig.initialLoadSize와 같습니다.

    Pager 또는 PagedList를 사용하지 않고 Paging2 DataSource를 테스트하며 initialLoadSize를 설정하는 경우 pageSizePagingConfig.pageSize와 일치하지 않을 수 있습니다. 테스트에서 이 부분이 중요하다면 DataSource 로드 메서드에 내부적으로 올바른 PageSize가 설정되도록 Pager/PagedList를 사용해 보세요. (I98ac7, b/149157296)

버그 수정

  • PagingConfig.maxSize가 설정된 구분자를 사용할 때 IllegalStateException으로 인해 발생하는 비정상 종료 문제를 수정했습니다. (I0ed33, b/174787528)
  • RemoteMediator가 설정된 경우 PREPEND/APPEND의 로드 상태가 초기 로드 직후에 NotLoading(endOfPaginationReached = true)으로 업데이트되지 않는 버그를 수정했습니다. (I8cf5a)
  • .snapshot(), .peek() 등의 프레젠터 측 API가 ListUpdateCallback 업데이트 내의 이전(오래된) 목록을 반환하는 버그를 수정했습니다.
  • Separator 연산자가 RemoteMediator와 함께 사용될 때 머리글 또는 바닥글이 추가되지 않는 버그를 수정했습니다.
  • RemoteMediator에서 NotLoading으로 LoadState를 업데이트하는 중 Loading 상태에서 멈추는 버그를 수정했습니다.
  • Paging2.0 호환성 API인 .asPagingSourceFactory()에서 DataSource가 잘못된 CoroutineDispatcher에서 초기화되도록 하는 버그를 수정했습니다. 특히 이 호환성 경로를 사용하는 Room의 현재 PagingSource 구현을 사용하는 경우 이 방법으로 비정상 종료 및 발생 가능한 ANR 사례가 해결됩니다.

버전 3.0.0-alpha10

2020년 12월 2일

androidx.paging:paging-*:3.0.0-alpha10이 출시되었습니다. 버전 3.0.0-alpha10에 포함된 커밋을 확인하세요.

API 변경사항

  • 지원 중단된 dataRefreshFlowdataRefreshListener API가 loadStateFlow/Listener 업데이트와 중복되어 삭제되었습니다. 이러한 마이그레이션에서는 다음이 loadStateFlow에 해당합니다.

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

    (Ib5570, b/173530908)

버그 수정

  • RemoteMediator REFRESH의 endOfPaginationReached가 이제 LoadState 업데이트로 올바르게 전파되고 원격 APPENDPREPEND가 트리거되지 않도록 합니다. (I94a3f, b/155290248)
  • 빈 초기 페이지 또는 대량 필터링으로 인해 빈 목록을 표시해도 이제 Paging에서 PREPEND 또는 APPEND 로드를 시작합니다. (I3e702, b/168169730)
  • 무효화가 빠르게 발생할 때 PagingSource의 후속 세대에서 getRefreshKey가 호출되지 않는 문제를 수정했습니다. (I45460, b/170027530)

외부 기여

  • 보내는 모든 PagingSources에 무효화를 전달하는 .invalidate() API와 함께 새로운 추상적 클래스 InvalidatingPagingSourceFactory가 추가되었습니다. @claraf3님, 감사합니다. (Ie71fc, b/160716447)

알려진 문제

  • RemoteMediator를 사용하는 경우 .insertSeparators() 변환에서 머리글과 바닥글이 즉시 표시되지 않을 수 있습니다. (b/172254056)
  • RemoteMediator를 사용하면 RemoteMediator.load()가 반환되기 전에 무효화 및 PagingSource.load(LoadParams.Refresh(...))가 완료되는 경우 원격 LoadState가 멈출 수 있습니다. (b/173717820)

버전 3.0.0-alpha09

2020년 11월 11일

androidx.paging:paging-*:3.0.0-alpha09가 출시되었습니다. 버전 3.0.0-alpha09에 포함된 커밋을 확인하세요.

API 변경사항

  • replaceWith 절을 사용하는 dataRefreshFlow/리스너 메서드를 완전히 지원 중단했습니다. (I6e2dd)

버그 수정

  • RemoteMediator와 함께 구분자를 사용할 때 IllegalArgumentException이 발생하고 endOfPagination을 반환하는 원격 로드가 계속 실행되는 동안 무효화가 트리거되는 문제를 수정했습니다. (I3a260)

버전 3.0.0-alpha08

2020년 10월 28일

androidx.paging:paging-*:3.0.0-alpha08이 출시되었습니다. 버전 3.0.0-alpha08에 포함된 커밋을 확인하세요.

API 변경사항

  • DataSource.InvalidatedCallback의 Kotlin/자바 변이는 기능 인터페이스를 통해 Kotlin에서 SAM 변환을 사용 설정하여 결합되었습니다(Kotlin 1.4에서 사용 가능). 이는 .map 또는 .mapByPage로 변환한 후 무효화 콜백의 kotlin 변이가 호출되지 않았던 버그를 수정했습니다. (I1f244, b/165313046)

버그 수정

  • ViewPager와의 Paging 상호작용이 크게 개선되었습니다. 특히 Paging은 페이지 무효화로 인해 더 이상 RemoteMediator#load 호출을 취소하지 않습니다. 또한 REFRESH가 필요한 경우 REFRESH 요청이 완료될 때까지 append/prepend 로드 요청이 더 이상 발생하지 않습니다. (I6390b, b/162252536)
  • MissingGetterMatchingBuilder의 API 린트 검사가 androidx용으로 사용 설정되었습니다. (I4bbea, b/138602561)
  • 백그라운드 스레드에서 RecyclerView에 알림으로써 .withLoadState* ConcatAdapter 도우미가 다운되는 버그를 수정했습니다. (I18bb5, b/170988309)
  • 비어 있지 않은 매우 작은 페이지를 로드할 때 프리패치가 제대로 로드되지 않는 버그를 수정했습니다. (Iffda3 b/169259468)

버전 3.0.0-alpha07

2020년 10월 1일

androidx.paging:paging-*:3.0.0-alpha07이 출시되었습니다. 버전 3.0.0-alpha07에 포함된 커밋을 확인하세요.

API 변경사항

  • 비동기 PagingData Guava 기반 연산자는 이제 실행 컨텍스트를 제어할 때 Executor를 매개변수로 허용합니다. (Id4372)

버그 수정

  • 경합 상태로 인해 RemoteMediator에서 발생하는 IndexOutOfBounds 예외가 수정되었습니다. (I00b7f, b/165821814)
  • DataSource에서 PagingSource로의 변환에서 결과로 생성된 PagingSource가 DataSource의 무효화 신호를 무시할 수 있는 경합 상태가 수정되었습니다.
  • 페이지 가져오기 로직에서 PagingDataAdapter.refresh()가 호출될 때까지 새로 생성된 PagingSource 버전을 얻지 못하는 문제가 해결되었습니다.
  • PagingSource(예: Room으로 생성된 것)로 변환된 DataSource를 RemoteMediator와 함께 사용할 때 가끔 스크롤 위치가 손실되던 문제가 해결되었습니다.

외부 기여

  • PagingData용으로 RxJava2, RxJava3 및 Guava 기반의 비동기 변환 연산자를 추가해 주신 @simonschiller님께 감사드립니다.

버전 3.0.0-alpha06

2020년 9월 2일

androidx.paging:paging-*:3.0.0-alpha06이 출시되었습니다. 버전 3.0.0-alpha06에 포함된 커밋을 확인하세요.

API 변경사항

  • 안정적인 ID 지원 부족에 관한 더 명확한 메시지를 제공하는 UnsupportedOperationException이 이제 PagingDataAdapter.setHasStableIds가 호출될 때마다 발생합니다. (Ib3890, b/158801427)

버그 수정

  • insertSeparator가 더 이상 빈 페이지를 필터링하지 않으므로 빈 페이지가 많이 삽입된 경우에도 프리젠터가 미리 가져오기 범위를 준수할 수 있습니다. (I9cff6, b/162538908)

버전 3.0.0-alpha05

2020년 8월 19일

androidx.paging:paging-*:3.0.0-alpha05가 출시되었습니다. 버전 3.0.0-alpha05에 포함된 커밋을 확인하세요.

버그 수정

  • 이제 Paging은 제시된 데이터가 매우 많이 필터링된 경우에도 페이지를 올바르게 미리 가져옵니다.
  • 재시도된 로드에 LoadResult.Error를 반환하면 항목 액세스가 재시도를 다시 잘못 트리거하는 경우가 더 이상 없습니다.

외부 기여

  • 일부 테스트를 정리하는 데 도움을 주신 클라라 에프님께 감사드립니다. (549612)

버전 3.0.0-alpha04

2020년 8월 5일

androidx.paging:paging-*:3.0.0-alpha04가 출시되었습니다. 버전 3.0.0-alpha04에 포함된 커밋을 확인하세요.

API 변경사항

  • 페이지 로드를 트리거하지 않고 제시된 데이터 액세스를 허용하도록 AsyncPagingDataDifferPagingDataAdapterpeek() API를 추가했습니다. (I38898, b/159104197)
  • 페이지 가져오기를 트리거하지 않고 제시된 항목을 검색할 수 있도록 PagingDataAdapterAsyncPagingDataDiffersnapshot() API를 추가했습니다. (I566b6, b/159104197)
  • 정적 목록을 제시하기 위해 PagingData.from(List<T>) 생성자를 추가했습니다. 이 생성자는 전반적인 PagingData 플로우와 결합하여 초기 REFRESH가 완료되기 전 또는 단순한 테스트용 변환 등 특정 상태의 정적 목록을 표시할 수 있습니다. (Id134d)
  • dataRefresh Flow / Listener API의 지원이 중단되었습니다. 이러한 API는 REFRESH에서 제시된 항목 상태를 노출하기 위해 사용되는 API였으나 loadState Flow / Listener 콜백 타이밍과 itemCount 속성이 개선되면서 불필요하게 되었습니다. (Ia19f3)
  • PagingSourceRemoteMediator RxJava3 호환성 래퍼가 추가되었습니다. (I49ef3, b/161480176)

버그 수정

  • PositionalDataSourcetoPagingSourceFactory 도우미를 통해 PagingSource로 전환되며, Room에서 생성된 PagingSource가 이제 스스로 올바른 표시를 통해 점핑을 지원합니다. (I3e84c, b/162161201)
  • submitData의 동기 변형을 사용하면 때때로 ClosedSendChannelException을 야기하는 경합 발생 버그가 수정되었습니다. (I4d702, b/160192222)

외부 기여

  • Slack을 대신하여 RxJava3 호환성 래퍼를 추가해 주신 잭 스위어스님께 감사드립니다. (I49ef3, b/161480176)

버전 3.0.0-alpha03

2020년 7월 22일

androidx.paging:paging-*:3.0.0-alpha03이 출시되었습니다. 버전 3.0.0-alpha03에 포함된 커밋을 확인하세요.

API 변경사항

  • PagingState의 생성자가 공개되어 getRefreshKey()의 테스트 구현이 쉬워졌습니다. (I8bf15)
  • 자바에서 DataSource Kotlin 매핑 함수 변형을 숨겨 원본 및 Kotlin 변형 사이의 모호성을 해결했습니다. (If7b23, b/161150011)
  • Kotlin 사용자의 편의를 위한 중복 API가 @JvmSynthetic으로 표시되었습니다. (I56ae5)
  • Loaditem.Page 생성자의 오버로드가 추가되었습니다. 이 항목은 itemsBefore 및 itemsAfter의 기본값을 COUNT_UNDEFINED로 지정합니다. (I47849)
  • 기존 PagingData 연산자가 정지 메서드를 허용하게 되었으며 자바 사용자를 위한 새로운 mapSync, flatMapSync, filterSync 비정지 연산자가 도입되었습니다. 기존 변환 메서드가 확장 함수로 이동되었으므로 이제 Kotlin 사용자가 이를 가져와야 합니다. (I34239, b/159983232)

버그 수정

  • Room(및 PositionalDataSource) PagingSources가 이제 첫 번째 페이지에 선행 구분자를 표시하므로 사용자가 이를 표시하기 위해 스크롤하지 않아도 됩니다. (I6f747, b/160257628)
  • 이제 자리표시자의 항목 액세스가 PagingData.filter()로 변환된 후 요청된 색인을 충족하는 페이지가 반환될 때까지 PagingSource 로드를 올바르게 실행합니다. (Ie95ae, b/160038730)
  • 때때로 PagingSource에서 오류를 반환한 후 스크롤하면 PagingDataAdapter.retry()에서 재시도하지 못하는 버그가 수정되었습니다. (I1084f, b/160194384)
  • 항목 액세스가 prefetchDistance 내에 있더라도 페이지를 삭제한 후 항목 액세스가 페이지를 로드하지 못했던 문제가 해결되었습니다. (Ie95ae, b/160038730)
  • PagingConfig.maxSize를 설정해도 더 이상 삭제 이벤트 후 자리표시자가 사용 설정되지 않습니다. (I2be29, b/129667766)

버전 3.0.0-alpha02

2020년 6월 24일

androidx.paging:paging-*:3.0.0-alpha02가 출시되었습니다. 버전 3.0.0-alpha02에 포함된 커밋을 확인하세요.

API 변경사항

  • 공통 기본값이 있는 PagingConfig의 생성자를 위한 오버로드가 추가되었습니다. (I39c50, b/158576040)
  • 공통 기본값이 있는 PagingDataAdapterAsyncPagingDataDiffer의 생성자를 위한 오버로드가 추가되었습니다. (Ie91f5)
  • 이제 어댑터 API, dataRefreshFlowdataRefreshListener가 부울을 전달하여 PagingData가 비어 있는지 알립니다. (I6e37e, b/159054196)
  • RemoteMediator를 위한 RxJava 및 Guava API인 RxRemoteMediatorListenableFutureRemoteMediator가 추가되었습니다.
  • isEmpty()firstItemOrNull()과 같은 일반적인 항목 액세스를 위해 PagingState에 도우미가 추가되었습니다. (I3b5b6, b/158892717)

버그 수정

  • Pager는 이제 팩토리에서 PagingSource 재사용을 확인하여 불명확한 오류를 발생시켰던 잘못된 PagingSource의 우발적인 재사용을 방지합니다. (I99809, b/158486430)
  • RemoteMediator REFRESH에서 실패가 발생하더라도 더 이상 PagingSource가 로드되는 것을 막지 않습니다. (I38b1b, b/158892717)
  • 정지되지 않은 버전의 submitData는 정지 버전의 submitData 이후에 호출될 때 여러 PagingData에서의 동시 수집으로 인해 더 이상 비정상 종료를 일으키지 않습니다. (I26358, b/158048877)
  • 구성 변경 후 발생할 수 있는 'pager에서 두 번 수집할 수 없음' 예외가 수정되었습니다. (I58bcc, b/158784811)

버전 3.0.0-alpha01

2020년 6월 10일

androidx.paging:paging-*:3.0.0-alpha01이 출시되었습니다. 버전 3.0.0-alpha01에 포함된 커밋을 확인하세요.

Paging 라이브러리가 몇 가지 새로운 주요 기능을 사용할 수 있도록 3.0으로 업데이트되었습니다.

3.0의 새로운 기능

알려진 문제

  • Paging 3 javadocs는 아직 제공되지 않습니다. 제공되기 전까지 위에 링크로 제공된 가이드 또는 Kotlin 문서를 이용하세요. (b/158614050)

버전 2.1.2

버전 2.1.2

2020년 3월 18일

androidx.paging:paging:2.1.2가 출시되었습니다. 2.1.0과 비교하여 버전 2.1.2에 포함된 커밋을 확인하세요.

버그 수정

  • 드물지만 무효화 중에 위치를 변환하는 경우의 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

2019년 12월 18일

androidx.paging:paging-*:2.1.1이 출시되었습니다. 버전 2.1.1에 포함된 커밋을 확인하세요.

버그 수정

  • PositionalDataSources의 인접한 초기 로드는 자리표시자가 사용 중지된 시점의 마지막 액세스를 중심으로 합니다.

버전 2.1.0

버전 2.1.0

2019년 1월 25일

Paging 2.1.02.1.0-rc01에서 변경사항 없이 출시되었습니다.

버전 2.1.0-rc01

2018년 12월 6일

Paging 2.1.0-rc012.1.0-beta01에서 변경사항 없이 출시되었습니다.

버전 2.1.0-beta01

2018년 11월 1일

Paging 2.1.0-beta012.1.0-alpha01에서 변경사항 없이 출시되었습니다.

버전 2.1.0-alpha01

2018년 10월 12일

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()RxPagedListBuilder의 Kotlin의 대안으로 추가되었습니다.
  • PagedList 전환 시 수신을 위해 AsyncPagedListDiffer.addPagedListListener()가 추가되었습니다. (b/111698609)
  • 이전 목록과 새로운 목록을 전달하는 PagedListAdapter.onCurrentListChanged() 변형이 추가되고, 이전 변형이 지원 중단되었습니다.
  • diffing 다음에 pagedlist가 표시되는 경우 트리거되는 추가 콜백을 받는 PagedListAdapter/AsyncPagedListDiffer.submitList() 변형이 추가되었습니다. 이를 통해 PagedList 전환을 다른 UI 업데이트와 동기화할 수 있습니다. (b/73781068)
  • PagedList.getLoadedCount()가 추가되어 메모리에 있는 항목의 수를 알 수 있습니다. 자리표시자가 사용 중지된 경우 반환 값은 항상 .size()와 같습니다.

버그 수정

  • diffing if 목록이 재사용될 때의 경합 상태가 해결되었습니다. (b/111591017)
  • 색인이 올바르지 않은 경우 이제 PagedList.loadAround()에서 IndexOutOfBoundsException이 발생합니다. 이전에는 명확하지 않은 다른 예외가 있을 때 다운됐습니다.
  • 극도로 작은 초기 로드 크기와 변경되지 않은 데이터가 함께 있으면 더 이상 로드되지 않는 문제가 해결되었습니다. (b/113122599)

버전 2.0.0

버전 2.0.0

2018년 10월 1일

Paging 2.0.0이 출시되었으며 버그 1개가 수정되었습니다.

버그 수정

  • PositionalDataSource 및 자리표시자를 사용하여 매우 빠르게 스크롤할 때 발생할 수 있는 비정상 종료 문제를 해결했습니다. (b/114635383)

버전 2.0.0-beta01

2018년 7월 2일

버그 수정

  • 일부 prepend 사례(자리표시자를 사용할 수 없음, PositionalDataSource)에서 콘텐츠가 사라지는 문제가 해결되었습니다. (b/80149146)
  • (1.0.1에 이미 출시됨) PagedListAdapterAsyncPagedListDiffer에서 이동 이벤트를 알리지 못하는 장애가 해결되었습니다. (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

2018년 6월 26일

Paging 1.0.1이 출시되었습니다. 이 버전에서는 runtime의 버그 1개가 수정되었습니다. 안정성을 위해 1.0.1을 사용하는 것이 좋습니다. Paging RxJava2 1.0.1도 출시되었으며, 이 버전은 1.0.0-rc1과 동일합니다.

버그 수정

  • PagedListAdapterAsyncPagedListDiffer에서 이동 이벤트를 알리지 못하는 장애가 해결되었습니다. (b/110711937)

RxJava2 버전 1.0.0

RxJava2 버전 1.0.0-rc1

2018년 5월 16일

Paging RxJava2 1.0.0-rc1은 초기 알파에서 변경사항 없이 버전 후보로 진행됩니다.

버전 1.0.0

버전 1.0.0-rc1

2018년 4월 19일 Paging 출시 후보

Paging 1.0.0 버전에 더 이상 알려진 문제가 없으며 새로운 기능을 추가하지 않을 예정입니다. 프로젝트를 업그레이드하여 1.0.0-rc1을 사용하면 Google에서 테스트하여 완벽한 1.0.0을 제공하는 데 도움이 됩니다.

이 출시는 변경사항이 없으며 1.0.0-beta1과 동일합니다.

버전 1.0.0-beta1

2018년 4월 5일

Paging은 출시 후보로 처리되기 전에 잠시 베타 버전 상태가 됩니다. Google은 향후 Paging 1.0의 API를 변경할 계획이 없으며, 모든 API 변경은 기준이 매우 높습니다.

Paging의 알파 RxJava2 지원은 선택적인 별도 모듈로 출시되었으며(android.arch.paging:rxjava2:1.0.0-alpha1) 안정화될 때까지 임시로 별도 버전이 지정될 예정입니다.

이 새로운 라이브러리는 LivePagedListBuilder의 RxJava2 대안을 제공하며 Executor 대신 Scheduler를 사용해 ObservableFlowable을 구성할 수 있습니다.

Kotlin

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

자바

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

새로운 기능

  • RxPagedListBuilder가 새로운 android.arch.paging:rxjava2 아티팩트를 통해 추가되었습니다.

API 변경사항

  • 빌더 내에서 실행기 역할을 명확히 하기 위한 API 변경사항:

    • setBackgroundThreadExecutor()에서 setFetchExecutor()로 이름이 변경되었습니다(PagedList.BuilderLivePagedListBuilder).

    • setMainThreadExecutor()에서 setNotifyExecutor()로 이름이 변경되었습니다(PagedList.Builder).

  • 비공개가 되도록 PagedList.mCallbacks 멤버가 수정되었습니다.

버그 수정

  • LivePagedListBuilder가 지정 Executor에서 Arch 구성요소 IO 스레드 풀 대신 초기 PagedList 로드를 트리거합니다.

  • 내부 DataSource 래퍼(DataSource.map뿐 아니라 자리표시자 사용이 중지된 PositionalDataSource 로딩을 구현하는 데 사용됨)에서 잘못된 동작이 수정되었습니다. (b/77237534)

버전 1.0.0-alpha7

2018년 3월 21일

Paging 1.0.0-alpha7이 Lifecycles 1.1.1과 함께 출시되었습니다. Paging alpha7이 위에 언급된 Function 클래스의 이동에 의존함에 따라 lifecycle:runtime 종속 항목을 android.arch.lifecycle:runtime:1.1.1로 업데이트해야 합니다.

Paging alpha7은 Paging이 베타 상태가 되기 전에 최종 버전으로 출시될 예정입니다.

API 변경사항

  • 이제 DataSource.LoadParams 객체에 공개 생성자가 있으며 DataSource.LoadCallback 객체는 추상 객체입니다. 따라서 DataSource를 래핑하거나 모의 콜백으로 DataSource를 직접 테스트할 수 있습니다. (b/72600421)
  • DataSource 및 DataSource.Factory의 매퍼
    • map(Function<IN,OUT>)을 사용하면 DataSource에서 로드한 결과를 변환, 래핑, 맞춤설정할 수 있습니다.
    • mapByPage(<List<IN>,List<OUT>>)는 동일한 작업을 일괄 처리합니다. 예를 들어 SQL에서 로드된 항목이 별도의 데이터베이스를 추가로 쿼리해야 하는 경우 일괄 작업으로 처리할 수 있습니다.
  • PagedList#getDataSource()가 편의 메서드로 추가되었습니다. (b/72611341)
  • recyclerview.extensions 패키지의 나머지 부분과 LivePagedListProvider를 포함하여 지원 중단된 모든 클래스가 API에서 삭제되었습니다.
  • DataSource.Factory가 인터페이스에서 추상 클래스로 변경되어 지도 기능을 사용 설정할 수 있습니다.

버그 수정

  • 빌더가 최종 버전으로 변경되었습니다. (b/70848565)
  • Room DataSource 구현이 이제 다중 테이블 쿼리를 처리하도록 수정되었습니다. 이 수정사항은 Room 1.1.0-beta1에 포함되어 있습니다(위 참조).
  • 자리표시자가 사용 설정되고 총 크기가 정확히 페이지 크기의 배수인 경우 PositionalDataSourceBoundaryCallback.onItemAtEndLoaded가 호출되지 않는 버그가 수정되었습니다.

버전 1.0.0-alpha5

2018년 1월 22일

버그 수정

  • 자리표시자 사용이 중지되었을 때 페이지 로드가 수정되었습니다. (b/70573345)
  • IllegalArgumentException 버그를 추적하기 위한 추가 로깅이 수정되었습니다. (b/70360195)(및 추론에 의한 Room 수정)
  • Javadoc 샘플 코드가 수정되었습니다. (b/70411933, b/71467637)