पेजिंग 3 पर माइग्रेट करें

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

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

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

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

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

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

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

  • DataSource क्लास
  • PagedList
  • PagedListAdapter

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

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

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

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 का इस्तेमाल करके, सही शुरुआती कुंजी को मैप किया जा सकेगा. state.anchorPosition, हाल ही में ऐक्सेस किया गया इंडेक्स है.

Kotlin

// Replaces ItemKeyedDataSource.
override fun getRefreshKey(state: PagingState<String, User>): String? {
  return state.anchorPosition?.let { anchorPosition ->
    state.getClosestItemToPosition(anchorPosition)?.id
  }
}

// Replacing PositionalDataSource.
override fun getRefreshKey(state: PagingState<Int, User>): Int? {
  return state.anchorPosition
}

Java

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

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

  return state.getClosestItemToPosition(anchorPosition);
}

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

सूची में बदलाव

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

  • DataSource.map()
  • DataSource.mapByPage()
  • DataSource.Factory.map()
  • DataSource.Factory.mapByPage()

Paging 3 में, सभी ट्रांसफ़ॉर्मेशन को PagingData पर ऑपरेटर के तौर पर लागू किया जाता है. अगर आपने पेज वाली सूची को बदलने के लिए, ऊपर दी गई सूची में से किसी भी तरीके का इस्तेमाल किया है, तो आपको ट्रांसफ़ॉर्मेशन लॉजिक को DataSource से PagingData में ले जाना होगा. ऐसा तब करना होगा, जब नए PagingSource का इस्तेमाल करके Pager बनाया जा रहा हो.

Paging 3 का इस्तेमाल करके, पेज वाले डेटा पर ट्रांसफ़ॉर्मेशन लागू करने के बारे में ज़्यादा जानने के लिए, डेटा स्ट्रीम ट्रांसफ़ॉर्म करना लेख पढ़ें.

PagedList

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

PagedListBuilder क्लास

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

  • पेजिंग कॉन्फ़िगरेशन को PagedList.Config से PagingConfig में ले जाया गया है.
  • LivePagedListBuilder और RxPagedListBuilder को एक ही Pager क्लास में जोड़ दिया गया है.
  • Pager, अपनी .flow प्रॉपर्टी के साथ एक ऑब्ज़र्वेबल Flow<PagingData> दिखाता है. RxJava और LiveData के वैरिएंट, एक्सटेंशन प्रॉपर्टी के तौर पर भी उपलब्ध हैं. इन्हें Java से स्टैटिक तरीकों का इस्तेमाल करके कॉल किया जा सकता है. ये paging-rxjava* और paging-runtime मॉड्यूल से उपलब्ध कराए जाते हैं.

Kotlin

val flow = Pager(
  // Configure how data is loaded by passing additional properties to
  // PagingConfig, such as prefetchDistance.
  PagingConfig(pageSize = 20)
) {
  ExamplePagingSource(backend, query)
}.flow
  .cachedIn(viewModelScope)

Java

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

// 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 की स्ट्रीम सेट अप करना लेख पढ़ें.

लेयर किए गए सोर्स के लिए BoundaryCallback

Paging 3 में, RemoteMediator, नेटवर्क और डेटाबेस से पेजिंग के लिए हैंडलर के तौर पर PagedList.BoundaryCallback की जगह लेता है.

Paging 3 में नेटवर्क और डेटाबेस से पेज पर डेटा लाने के लिए, RemoteMediator का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, Android Paging कोडलैब देखें.

PagedListAdapter

पेजिंग 2, PagedList को RecyclerView से बाइंड करने के लिए PagedListAdapter का इस्तेमाल करता है. पेजिंग 3 में, PagingData की जगह PagedList का इस्तेमाल किया जाता है. अगर आपको अपने ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) के लिए Jetpack Compose का इस्तेमाल करना है, तो आपको पेज किए गए डेटा को दिखाने के लिए अडैप्टर की ज़रूरत नहीं होगी.

इसके बजाय, paging-compose आर्टफ़ैक्ट और इसके collectAsLazyPagingItems एक्सटेंशन मेथड का इस्तेमाल करके, PagingData आइटम इकट्ठा करें और उन्हें @Composable फ़ंक्शन में दिखाएं. जैसे, LazyColumn.

Jetpack Compose के साथ Paging 3 का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, Paging 3 की खास जानकारी देखें.

अन्य संसाधन

पेजिंग लाइब्रेरी के बारे में ज़्यादा जानने के लिए, यहां दिए गए अन्य संसाधन देखें:

कोडलैब

सैंपल