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

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

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

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

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

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

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

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

  • DataSource क्लास
  • PagedList
  • PagedListAdapter

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

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

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

DataSource क्लास

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

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

पेज 3 में, लोड करने के तरीके के सभी पैरामीटर, LoadParams से बदल दिए जाते हैं सील्ड क्लास, जिसमें हर लोड टाइप के लिए सब-क्लास शामिल हैं. अगर आपको अपने load() तरीके में लोड टाइप के बीच अंतर करें. साथ ही, देखें कि LoadParams की सब-क्लास को इसमें पास किया गया: LoadParams.Refresh, LoadParams.Prepend या LoadParams.Append.

PagingSource लागू करने के बारे में ज़्यादा जानने के लिए, डेटा तय करना देखें स्रोत.

बटन रीफ़्रेश करें

PagingSource लागू करने के लिए यह तय किया जाना चाहिए कि रीफ़्रेश लोड किए गए पेज डेटा के बीच में मौजूद होता है. ऐसा करने के लिए getRefreshKey() सबसे हाल ही के के तौर पर state.anchorPosition का इस्तेमाल करके सही शुरुआती कुंजी को मैप करने के लिए ऐक्सेस किया गया इंडेक्स.

Kotlin

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

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

Java

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

  return state.getClosestItemToPosition(anchorPosition);
}

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

Java

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

  return state.getClosestItemToPosition(anchorPosition);
}

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

बदलावों की सूची बनाएं

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

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

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

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

पेज वाली सूची

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

PagedListBuilder क्लास

पेज 2 में, मौजूदा PagedList की जगह PagingData का इस्तेमाल किया गया है. इस पर माइग्रेट करने के लिए 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);

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

लेयर वाले सोर्स के लिए बाउंड्री कॉलबैक

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

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

PagedListAdapter

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

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

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

AsyncPagedListDiffer

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

Kotlin

AsyncPagingDataDiffer(diffCallback, listUpdateCallback)

Java

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

Java

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

अन्य संसाधन

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

कोड लैब

सैंपल