المفاهيم وتنفيذ Jetpack Compose
يختلف الإصدار 3 من مكتبة Paging بشكلٍ كبير عن الإصدارات السابقة. ويوفّر هذا الإصدار وظائف محسّنة ويعالج الصعوبات الشائعة عند استخدام الإصدار 2 من مكتبة Paging. إذا كان تطبيقك يستخدم إصدارًا سابقًا من مكتبة Paging، يُرجى قراءة هذه الصفحة لمعرفة المزيد عن النقل إلى الإصدار 3 من مكتبة Paging.
إذا كان الإصدار 3 من مكتبة Paging هو أول إصدار تستخدمه في تطبيقك، يُرجى الاطّلاع على مقالة تحميل البيانات المقسَّمة إلى صفحات وعرضها للحصول على معلومات أساسية عن الاستخدام.
مزايا النقل إلى الإصدار 3 من مكتبة Paging
يتضمّن الإصدار 3 من مكتبة Paging الميزات التالية التي لم تكن متوفّرة في الإصدارات السابقة من المكتبة:
- دعم كامل لـ Kotlin coroutines وFlow
- دعم التحميل غير المتزامن باستخدام RxJava
Singleأو GuavaListenableFuture - حالات التحميل المضمّنة وإشارات الخطأ لتصميم واجهة مستخدم سريعة الاستجابة، بما في ذلك وظيفة إعادة المحاولة وإعادة التحميل
- تحسينات على طبقة المستودع، بما في ذلك دعم الإلغاء وواجهة مصدر بيانات مبسطة
- تحسينات على طبقة العرض، وفواصل القوائم، وعمليات تحويل الصفحات المخصّصة، ورؤوس وتذييلات حالة التحميل
نقل تطبيقك إلى الإصدار 3 من مكتبة Paging
للنقل بالكامل إلى الإصدار 3 من مكتبة Paging، عليك نقل جميع المكوّنات الرئيسية الثلاثة من الإصدار 2 من مكتبة Paging:
- فئات
DataSource PagedListPagedListAdapter
ومع ذلك، تتوافق بعض مكوّنات الإصدار 3 من مكتبة Paging مع الإصدارات السابقة من مكتبة Paging. على وجه الخصوص، يمكن أن تكون واجهة برمجة التطبيقات PagingSource من الإصدار 3 من مكتبة Paging
مصدر بيانات لـ LivePagedListBuilder وRxPagedListBuilder
من الإصدارات الأقدم. وبالمثل، يمكن لواجهة برمجة التطبيقات Pager استخدام كائنات DataSource
الأقدم من خلال طريقة asPagingSourceFactory. هذا يعني أنّ لديك خيارات النقل التالية:
- يمكنك نقل
DataSourceإلىPagingSourceمع ترك بقية عملية تنفيذ Paging بدون تغيير. - يمكنك نقل
PagedListوPagedListAdapterمع الاستمرار في استخدام واجهة برمجة التطبيقات الأقدمDataSource. - يمكنك نقل عملية تنفيذ Paging بالكامل لنقل تطبيقك بالكامل إلى الإصدار 3 من مكتبة Paging.
توضّح الأقسام في هذه الصفحة كيفية نقل مكوّنات Paging على كل طبقة من طبقات تطبيقك.
نظرة عامة على عملية النقل
للنقل بالكامل إلى الإصدار 3 من مكتبة Paging مع الاحتفاظ بعملية تنفيذ RecyclerView، عليك تعديل المكوّنات التالية:
مكوِّن الإصدار 2 من مكتبة Paging |
بديل الإصدار 3 من مكتبة Paging |
|
|
|
|
|
|
|
|
فئات DataSource
يصف هذا القسم التغييرات اللازمة لنقل عملية تنفيذ Paging أقدم لاستخدام PagingSource.
يتم دمج PageKeyedDataSource, PositionalDataSource وItemKeyedDataSource من
الإصدار 2 من مكتبة Paging في واجهة برمجة التطبيقات PagingSource في الإصدار 3 من مكتبة Paging. يتم دمج طرق التحميل من جميع فئات واجهة برمجة التطبيقات القديمة في طريقة load واحدة في PagingSource. يقلّل ذلك من تكرار الرموز البرمجية لأنّ الكثير من المنطق في طرق التحميل في عمليات تنفيذ فئات واجهة برمجة التطبيقات القديمة غالبًا ما يكون متطابقًا.
يتم استبدال جميع مَعلمات طريقة التحميل في الإصدار 3 من مكتبة Paging بفئة 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 في الإصدار 3 من مكتبة Paging.
فئات PagedListBuilder
يحلّ PagingData محلّ PagedList الحالي من الإصدار 2 من مكتبة Paging. للنقل إلى PagingData، عليك تعديل ما يلي:
- تم نقل إعدادات Paging من
PagedList.ConfigإلىPagingConfig. - تم دمج
LivePagedListBuilderوRxPagedListBuilderفي فئةPagerواحدة. Pagerتعرض عنصر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 باستخدام
الإصدار 3 من مكتبة Paging، يُرجى الاطّلاع على مقالة إعداد مصدر PagingData.
PagedListAdapter
يصف هذا القسم جميع التغييرات اللازمة لنقل عملية تنفيذ Paging أقدم لاستخدام فئتَي PagingDataAdapter أو AsyncPagingDataDiffer من الإصدار 3 من مكتبة Paging.
يستخدم الإصدار 2 من مكتبة Paging PagedListAdapter لربط PagedList بـ RecyclerView. في الإصدار 3 من مكتبة Paging، يحلّ PagingData محلّ PagedList.
يوفّر الإصدار 3 من مكتبة Paging PagingDataAdapter للتعامل مع المصادر التفاعلية الجديدة PagingData reactive
streams. في ما عدا ذلك، تتطابق واجهة PagedListAdapter وPagingDataAdapter. للنقل من PagedListAdapter إلى PagingDataAdapter، غيِّر عملية تنفيذ PagedListAdapter لتوسيع PagingDataAdapter بدلاً من ذلك.
لمزيد من المعلومات عن PagingDataAdapter، يُرجى الاطّلاع على مقالة تحديد محوّل RecyclerView
adapter.
AsyncPagedListDiffer
إذا كنت تستخدم حاليًا عملية تنفيذ مخصّصة لـ RecyclerView.Adapter مع AsyncPagedListDiffer، ننصحك بنقل عملية التنفيذ لاستخدام AsyncPagingDataDiffer المتوفّر في الإصدار 3 من مكتبة Paging بدلاً من ذلك:
Kotlin
AsyncPagingDataDiffer(diffCallback, listUpdateCallback)
Java (RxJava)
new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);
Java (Guava/LiveData)
new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);