ย้ายข้อมูลไปยัง Paging 3 (มุมมอง)

แนวคิดและการติดตั้งใช้งาน Jetpack Compose

Paging 3 แตกต่างจาก Paging Library เวอร์ชันก่อนหน้าอย่างมาก เวอร์ชันนี้มีฟังก์ชันการทำงานที่ได้รับการปรับปรุงและแก้ไขปัญหาที่พบบ่อย ในการใช้ Paging 2 หากแอปใช้ไลบรารี Paging เวอร์ชันก่อนหน้าอยู่แล้ว โปรดอ่านหน้านี้เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการย้ายข้อมูลไปยัง Paging 3

หาก Paging 3 เป็นไลบรารี Paging เวอร์ชันแรกที่คุณใช้ในแอป โปรดดูข้อมูลการใช้งานพื้นฐานที่โหลดและแสดงข้อมูลที่แบ่งหน้า

ประโยชน์ของการย้ายข้อมูลไปยัง Paging 3

Paging 3 มีฟีเจอร์ต่อไปนี้ที่ไม่มีในไลบรารีเวอร์ชันก่อนหน้า

  • รองรับ Kotlin Coroutines และ Flow อย่างเต็มที่
  • รองรับการโหลดแบบไม่พร้อมกันโดยใช้ RxJava Single หรือ Guava ListenableFuture primitive
  • สถานะการโหลดและสัญญาณข้อผิดพลาดในตัวสำหรับการออกแบบ UI ที่ตอบสนอง รวมถึงฟังก์ชันการลองใหม่และการรีเฟรช
  • การปรับปรุงเลเยอร์ที่เก็บ รวมถึงการรองรับการยกเลิกและอินเทอร์เฟซแหล่งข้อมูลที่เรียบง่าย
  • การปรับปรุงเลเยอร์การนำเสนอ ตัวคั่นรายการ การเปลี่ยนรูปแบบหน้าเว็บที่กำหนดเอง รวมถึงส่วนหัวและส่วนท้ายของสถานะการโหลด

ย้ายข้อมูลแอปไปยัง Paging 3

หากต้องการย้ายข้อมูลไปยัง Paging 3 อย่างสมบูรณ์ คุณต้องย้ายข้อมูลคอมโพเนนต์หลักทั้ง 3 รายการ จาก Paging 2 ดังนี้

  • DataSource ชั้นเรียน
  • PagedList
  • PagedListAdapter

อย่างไรก็ตาม คอมโพเนนต์ Paging 3 บางรายการจะเข้ากันได้กับ Paging เวอร์ชันก่อนหน้า โดยเฉพาะอย่างยิ่ง API PagingSource จาก Paging 3 สามารถเป็นแหล่งข้อมูลสำหรับ LivePagedListBuilder และ RxPagedListBuilder จากเวอร์ชันเก่ากว่าได้ ในทำนองเดียวกัน Pager API สามารถใช้ออบเจ็กต์ DataSource รุ่นเก่ากับเมธอด asPagingSourceFactory ได้ ซึ่งหมายความว่าคุณมี ตัวเลือกการย้ายข้อมูลต่อไปนี้

  • คุณสามารถย้ายข้อมูล DataSource ไปยัง PagingSource ได้ แต่ไม่ต้องเปลี่ยนแปลงการใช้งาน Paging ที่เหลือ
  • คุณสามารถย้ายข้อมูล PagedList และ PagedListAdapter แต่ยังคงใช้ API DataSource รุ่นเก่าได้
  • คุณสามารถย้ายข้อมูลการติดตั้งใช้งาน Paging ทั้งหมดเพื่อย้ายข้อมูลแอปไปยัง Paging 3 ได้อย่างสมบูรณ์

ส่วนต่างๆ ในหน้านี้จะอธิบายวิธีย้ายข้อมูลคอมโพเนนต์การแบ่งหน้าในแต่ละเลเยอร์ ของแอป

ภาพรวมการย้ายข้อมูล

หากต้องการย้ายข้อมูลไปยัง Paging 3 อย่างสมบูรณ์ในขณะที่ยังคงใช้RecyclerViewการติดตั้งใช้งาน คุณต้องอัปเดตคอมโพเนนต์ต่อไปนี้

คอมโพเนนต์การแบ่งหน้า 2

การเปลี่ยนทดแทนเพจจิ้ง 3

PageKeyedDataSource

PagingSource

PagedListAdapter

PagingDataAdapter

LivePagedListBuilder

Pager

BoundaryCallback

RemoteMediator

DataSource ชั้นเรียน

ส่วนนี้อธิบายการเปลี่ยนแปลงที่จำเป็นในการย้ายข้อมูลการใช้งาน Paging เวอร์ชันเก่ากว่า ไปใช้ PagingSource

PageKeyedDataSource, PositionalDataSource และ ItemKeyedDataSource จาก Paging 2 จะรวมกันเป็น PagingSource API ใน Paging 3 ระบบจะรวมเมธอดการโหลด จากคลาส API เก่าทั้งหมดไว้ในload เมธอดเดียวใน PagingSource วิธีนี้ช่วยลดการทำโค้ดซ้ำเนื่องจากตรรกะส่วนใหญ่ในวิธีการโหลดต่างๆ ในการติดตั้งใช้งานคลาส API เก่านั้นมักจะเหมือนกัน

พารามิเตอร์วิธีการโหลดทั้งหมดจะถูกแทนที่ใน Paging 3 ด้วยLoadParams คลาสที่ปิดผนึก ซึ่งรวมถึงคลาสย่อยสำหรับแต่ละประเภทการโหลด หากต้องการแยกความแตกต่างระหว่างประเภทการโหลดในload ให้ตรวจสอบว่ามีการส่งคลาสย่อยใดของ LoadParams: LoadParams.Refresh, LoadParams.Prepend หรือ LoadParams.Append

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งใช้งาน PagingSource ได้ที่กําหนดแหล่งข้อมูล

รีเฟรชคีย์

การติดตั้งใช้งาน PagingSource ต้องกําหนดวิธีรีเฟรชต่อจากกลางข้อมูลหน้าเว็บที่โหลด โดยทำได้ด้วยการใช้ getRefreshKey เพื่อแมปคีย์เริ่มต้นที่ถูกต้องโดยใช้ state.anchorPosition เป็นดัชนีที่เข้าถึงล่าสุด

Java (RxJava)

// Replaces ItemKeyedDataSource.
@Nullable
@Override
String getRefreshKey(state: PagingState<String, User>) {
  Integer anchorPosition = state.anchorPosition;
  if (anchorPosition == null) {
    return null;
  }

  return state.getClosestItemToPosition(anchorPosition);
}

// Replaces PositionalDataSource.
@Nullable
@Override
Integer getRefreshKey(state: PagingState<Integer, User>) {
  return state.anchorPosition;
}

Java (Guava/LiveData)

// Replaces ItemKeyedDataSource.
@Nullable
@Override
String getRefreshKey(state: PagingState<String, User>) {
  Integer anchorPosition = state.anchorPosition;
  if (anchorPosition == null) {
    return null;
  }

  return state.getClosestItemToPosition(anchorPosition);
}

// Replaces PositionalDataSource.
@Nullable
@Override
Integer getRefreshKey(state: PagingState<Integer, User>) {
  return state.anchorPosition;
}

PagedList

ส่วนนี้อธิบายการเปลี่ยนแปลงที่จำเป็นทั้งหมดเพื่อย้ายข้อมูลการใช้งาน Paging เวอร์ชันเก่าให้ใช้ Pager และ PagingData ใน Paging 3

PagedListBuilder ชั้นเรียน

PagingData จะแทนที่ PagedList ที่มีอยู่จาก Paging 2 หากต้องการย้ายข้อมูลไปยัง PagingData คุณต้องอัปเดตข้อมูลต่อไปนี้

  • การกำหนดค่าการแบ่งหน้าได้ย้ายจาก PagedList.Config ไปยัง PagingConfig แล้ว
  • เราได้รวม LivePagedListBuilder และ RxPagedListBuilder เข้าด้วยกันเป็นชั้นเรียน Pager เดียว
  • Pager จะแสดง Observable Flow<PagingData> ด้วยflow พร็อพเพอร์ตี้ นอกจากนี้ ตัวแปร RxJava และ LiveData ยังพร้อมให้บริการเป็นพร็อพเพอร์ตี้ส่วนขยาย ซึ่งเรียกใช้ได้จาก Java ผ่านเมธอดแบบคงที่ และให้บริการจากโมดูล paging-rxjava* และ paging-runtime ตามลำดับ

Java (RxJava)

// CoroutineScope helper provided by the lifecycle-viewmodel-ktx artifact.
CoroutineScope viewModelScope = ViewModelKt.getViewModelScope(viewModel);
Pager<Integer, User> pager = Pager<>(
  new PagingConfig(/* pageSize = */ 20),
  () -> ExamplePagingSource(backend, query));

Flowable<PagingData<User>> flowable = PagingRx.getFlowable(pager);
PagingRx.cachedIn(flowable, viewModelScope);

Java (Guava/LiveData)

// CoroutineScope helper provided by the lifecycle-viewmodel-ktx artifact.
CoroutineScope viewModelScope = ViewModelKt.getViewModelScope(viewModel);
Pager<Integer, User> pager = Pager<>(
  new PagingConfig(/* pageSize = */ 20),
  () -> ExamplePagingSource(backend, query));

PagingLiveData.cachedIn(PagingLiveData.getLiveData(pager), viewModelScope);

ดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าสตรีมแบบรีแอกทีฟของออบเจ็กต์ PagingData โดยใช้ Paging 3 ได้ที่ตั้งค่าสตรีมของ PagingData

PagedListAdapter

ส่วนนี้อธิบายการเปลี่ยนแปลงที่จำเป็นทั้งหมดเพื่อย้ายข้อมูลการใช้งาน Paging เวอร์ชันเก่ากว่าให้ใช้คลาส PagingDataAdapter หรือ AsyncPagingDataDiffer จาก Paging 3

Paging 2 ใช้ PagedListAdapter เพื่อเชื่อมโยง PagedList กับ RecyclerView ใน Paging 3 PagingData จะแทนที่ PagedList

Paging 3 มี PagingDataAdapter เพื่อจัดการสตรีมแบบรีแอกทีฟ PagingData ใหม่ ไม่เช่นนั้น PagedListAdapter และ PagingDataAdapter จะมีอินเทอร์เฟซเดียวกัน หากต้องการย้ายข้อมูลจาก PagedListAdapter ไปยัง PagingDataAdapter ให้เปลี่ยน การติดตั้งใช้งาน PagedListAdapter เพื่อขยาย PagingDataAdapter แทน

ดูข้อมูลเพิ่มเติมเกี่ยวกับ PagingDataAdapter ได้ที่กำหนดอะแดปเตอร์ RecyclerView

AsyncPagedListDiffer

หากปัจจุบันคุณใช้การติดตั้งใช้งาน RecyclerView.Adapter ที่กำหนดเองกับ AsyncPagedListDiffer ให้ย้ายข้อมูลการติดตั้งใช้งานเพื่อใช้ AsyncPagingDataDiffer ที่ระบุไว้ใน Paging 3 แทน

Kotlin

AsyncPagingDataDiffer(diffCallback, listUpdateCallback)

Java (RxJava)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

Java (Guava/LiveData)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);