Paging 3 (Views) पर माइग्रेट करना

कॉन्सेप्ट और Jetpack Compose को लागू करने का तरीका

Paging 3, Paging लाइब्रेरी के पुराने वर्शन से काफ़ी अलग है. इस वर्शन में बेहतर सुविधाएं हैं. साथ ही, इसमें Paging 2 का इस्तेमाल करने में आने वाली आम समस्याओं को ठीक किया गया है. अगर आपका ऐप्लिकेशन, Paging लाइब्रेरी के पुराने वर्शन का इस्तेमाल करता है, तो Paging 3 पर माइग्रेट करने के बारे में ज़्यादा जानने के लिए, यह पेज पढ़ें.

अगर Paging 3, Paging लाइब्रेरी का वह पहला वर्शन है जिसका इस्तेमाल आपके ऐप्लिकेशन में किया जा रहा है, तो सामान्य इस्तेमाल के बारे में जानकारी पाने के लिए, पेज में बांटा गया डेटा लोड करना और दिखाना लेख पढ़ें.

Paging 3 पर माइग्रेट करने के फ़ायदे

Paging 3 में ये सुविधाएं शामिल हैं. ये सुविधाएं, लाइब्रेरी के पुराने वर्शन में मौजूद नहीं थीं:

  • Kotlin कोरूटीन और Flow के लिए, बेहतर सहायता.
  • RxJava Single या Guava ListenableFuture प्रिमिटिव का इस्तेमाल करके, एसिंक्रोनस तरीके से लोड करने की सुविधा.
  • रिस्पॉन्सिव यूज़र इंटरफ़ेस (यूआई) डिज़ाइन के लिए, लोड की स्थिति और गड़बड़ी के सिग्नल की सुविधा. इसमें फिर से कोशिश करने और रीफ़्रेश करने की सुविधा भी शामिल है.
  • रिपॉज़िटरी लेयर में सुधार, जिसमें कैंसल करने की सुविधा और डेटा सोर्स का आसान इंटरफ़ेस शामिल है.
  • प्रज़ेंटेशन लेयर, सूची सेपरेटर, कस्टम पेज ट्रांसफ़ॉर्म, और लोड की स्थिति के हेडर और फ़ुटर में सुधार.

अपने ऐप्लिकेशन को Paging 3 पर माइग्रेट करना

Paging 3 पर पूरी तरह से माइग्रेट करने के लिए, आपको Paging 2 के इन तीनों मुख्य कॉम्पोनेंट को माइग्रेट करना होगा:

  • DataSource क्लास
  • PagedList
  • PagedListAdapter

हालांकि, Paging 3 के कुछ कॉम्पोनेंट, Paging के पुराने वर्शन के साथ काम करते हैं. खास तौर पर, Paging 3 का PagingSource एपीआई, पुराने वर्शन के LivePagedListBuilder और RxPagedListBuilder के लिए डेटा सोर्स हो सकता है. इसी तरह, Pager एपीआई, पुराने DataSource ऑब्जेक्ट का इस्तेमाल asPagingSourceFactory तरीके से कर सकता है. इसका मतलब है कि आपके पास माइग्रेशन के ये विकल्प हैं:

  • DataSource को PagingSource पर माइग्रेट किया जा सकता है. हालांकि, Paging को लागू करने के बाकी तरीके में कोई बदलाव नहीं किया जा सकता.
  • आप अपने PagedList और PagedListAdapter को माइग्रेट कर सकते हैं, लेकिन पुराने DataSource एपीआई का इस्तेमाल जारी रख सकते हैं.
  • Paging को लागू करने के पूरे तरीके को माइग्रेट किया जा सकता है, ताकि आपके ऐप्लिकेशन को Paging 3 पर पूरी तरह से माइग्रेट किया जा सके.

इस पेज पर मौजूद सेक्शन में, आपके ऐप्लिकेशन की हर लेयर पर Paging कॉम्पोनेंट को माइग्रेट करने का तरीका बताया गया है.

माइग्रेशन की खास जानकारी

RecyclerView को लागू करने के तरीके को बनाए रखते हुए, Paging 3 पर पूरी तरह से माइग्रेट करने के लिए, आपको इन कॉम्पोनेंट को अपडेट करना होगा:

Paging 2 कॉम्पोनेंट

Paging 3 में कॉम्पोनेंट की जगह इस्तेमाल होने वाला कॉम्पोनेंट

PageKeyedDataSource

PagingSource

PagedListAdapter

PagingDataAdapter

LivePagedListBuilder

Pager

BoundaryCallback

RemoteMediator

DataSource क्लास

इस सेक्शन में, Paging को लागू करने के पुराने तरीके को PagingSource का इस्तेमाल करने के लिए माइग्रेट करने के लिए ज़रूरी बदलावों के बारे में बताया गया है.

Paging 2 के PageKeyedDataSource, PositionalDataSource, और ItemKeyedDataSource को Paging 3 में PagingSource एपीआई में शामिल कर दिया गया है. पुराने एपीआई की सभी क्लास के लोड करने के तरीकों को PagingSource में एक ही load तरीके में शामिल कर दिया गया है. इससे कोड डुप्लीकेट होने की समस्या कम हो जाती है, क्योंकि पुराने एपीआई की क्लास को लागू करने के दौरान, लोड करने के तरीकों में इस्तेमाल की जाने वाली ज़्यादातर लॉजिक एक जैसी होती है.

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 को लागू करने के पुराने तरीके को Paging 3 में Pager और PagingData का इस्तेमाल करने के लिए माइग्रेट करने के लिए ज़रूरी सभी बदलावों के बारे में बताया गया है.

PagedListBuilder क्लास

Paging 2 के मौजूदा PagedList की जगह, PagingData का इस्तेमाल किया जाता है. PagingData पर माइग्रेट करने के लिए, आपको ये अपडेट करने होंगे:

  • पेजिंग कॉन्फ़िगरेशन को 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);

Paging 3 का इस्तेमाल करके, PagingData ऑब्जेक्ट की रिएक्टिव स्ट्रीम सेट अप करने के बारे में ज़्यादा जानने के लिए, PagingData की स्ट्रीम सेट अप करना लेख पढ़ें.

PagedListAdapter

इस सेक्शन में, Paging को लागू करने के पुराने तरीके को Paging 3 की PagingDataAdapter या AsyncPagingDataDiffer क्लास का इस्तेमाल करने के लिए माइग्रेट करने के लिए ज़रूरी सभी बदलावों के बारे में बताया गया है.

Paging 2 में, PagedListAdapter को PagedList से बाइंड करने के लिए, RecyclerView का इस्तेमाल किया जाता है. Paging 3 में, PagedList की जगह PagingData का इस्तेमाल किया जाता है.

Paging 3 में, PagingData की नई रिएक्टिव स्ट्रीम को मैनेज करने के लिए, PagingDataAdapter की सुविधा दी गई है. इसके अलावा, PagedListAdapter और PagingDataAdapter का इंटरफ़ेस एक जैसा होता है. PagedListAdapter से PagingDataAdapter पर माइग्रेट करने के लिए, PagedListAdapter को लागू करने के तरीके में बदलाव करें, ताकि यह PagingDataAdapter को एक्सटेंड करे.

PagingDataAdapter के बारे में ज़्यादा जानने के लिए, RecyclerView अडैप्टर तय करना लेख पढ़ें.

AsyncPagedListDiffer

अगर फ़िलहाल, AsyncPagedListDiffer के साथ RecyclerView.Adapter को लागू करने के कस्टम तरीके का इस्तेमाल किया जा रहा है, तो इसे Paging 3 में दिए गए AsyncPagingDataDiffer का इस्तेमाल करने के लिए माइग्रेट करें:

Kotlin

AsyncPagingDataDiffer(diffCallback, listUpdateCallback)

Java (RxJava)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

Java (Guava/LiveData)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);