แนวคิดและการติดตั้งใช้งาน Jetpack Compose
Paging 3 แตกต่างจาก Paging Library เวอร์ชันก่อนหน้าอย่างมาก เวอร์ชันนี้มีฟังก์ชันการทำงานที่ได้รับการปรับปรุงและแก้ไขปัญหาที่พบบ่อย ในการใช้ Paging 2 หากแอปใช้ไลบรารี Paging เวอร์ชันก่อนหน้าอยู่แล้ว โปรดอ่านหน้านี้เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการย้ายข้อมูลไปยัง Paging 3
หาก Paging 3 เป็นไลบรารี Paging เวอร์ชันแรกที่คุณใช้ในแอป โปรดดูข้อมูลการใช้งานพื้นฐานที่โหลดและแสดงข้อมูลที่แบ่งหน้า
ประโยชน์ของการย้ายข้อมูลไปยัง Paging 3
Paging 3 มีฟีเจอร์ต่อไปนี้ที่ไม่มีในไลบรารีเวอร์ชันก่อนหน้า
- รองรับ Kotlin Coroutines และ Flow อย่างเต็มที่
- รองรับการโหลดแบบไม่พร้อมกันโดยใช้ RxJava
Singleหรือ GuavaListenableFutureprimitive - สถานะการโหลดและสัญญาณข้อผิดพลาดในตัวสำหรับการออกแบบ UI ที่ตอบสนอง รวมถึงฟังก์ชันการลองใหม่และการรีเฟรช
- การปรับปรุงเลเยอร์ที่เก็บ รวมถึงการรองรับการยกเลิกและอินเทอร์เฟซแหล่งข้อมูลที่เรียบง่าย
- การปรับปรุงเลเยอร์การนำเสนอ ตัวคั่นรายการ การเปลี่ยนรูปแบบหน้าเว็บที่กำหนดเอง รวมถึงส่วนหัวและส่วนท้ายของสถานะการโหลด
ย้ายข้อมูลแอปไปยัง Paging 3
หากต้องการย้ายข้อมูลไปยัง Paging 3 อย่างสมบูรณ์ คุณต้องย้ายข้อมูลคอมโพเนนต์หลักทั้ง 3 รายการ จาก Paging 2 ดังนี้
DataSourceชั้นเรียนPagedListPagedListAdapter
อย่างไรก็ตาม คอมโพเนนต์ Paging 3 บางรายการจะเข้ากันได้กับ Paging เวอร์ชันก่อนหน้า โดยเฉพาะอย่างยิ่ง API PagingSource จาก Paging 3 สามารถเป็นแหล่งข้อมูลสำหรับ LivePagedListBuilder และ RxPagedListBuilder
จากเวอร์ชันเก่ากว่าได้ ในทำนองเดียวกัน Pager API สามารถใช้ออบเจ็กต์ DataSource
รุ่นเก่ากับเมธอด asPagingSourceFactory ได้ ซึ่งหมายความว่าคุณมี
ตัวเลือกการย้ายข้อมูลต่อไปนี้
- คุณสามารถย้ายข้อมูล
DataSourceไปยังPagingSourceได้ แต่ไม่ต้องเปลี่ยนแปลงการใช้งาน Paging ที่เหลือ - คุณสามารถย้ายข้อมูล
PagedListและPagedListAdapterแต่ยังคงใช้ APIDataSourceรุ่นเก่าได้ - คุณสามารถย้ายข้อมูลการติดตั้งใช้งาน Paging ทั้งหมดเพื่อย้ายข้อมูลแอปไปยัง Paging 3 ได้อย่างสมบูรณ์
ส่วนต่างๆ ในหน้านี้จะอธิบายวิธีย้ายข้อมูลคอมโพเนนต์การแบ่งหน้าในแต่ละเลเยอร์ ของแอป
ภาพรวมการย้ายข้อมูล
หากต้องการย้ายข้อมูลไปยัง Paging 3 อย่างสมบูรณ์ในขณะที่ยังคงใช้RecyclerViewการติดตั้งใช้งาน
คุณต้องอัปเดตคอมโพเนนต์ต่อไปนี้
คอมโพเนนต์การแบ่งหน้า 2 |
การเปลี่ยนทดแทนเพจจิ้ง 3 |
|
|
|
|
|
|
|
|
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จะแสดง ObservableFlow<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);