Paging 3, Paging लाइब्रेरी के पुराने वर्शन से काफ़ी अलग है.
इस वर्शन में बेहतर सुविधाएं मिलती हैं. साथ ही, Kotlin coroutines और Flow के लिए बेहतर सहायता मिलती है. इसके अलावा, इसे Jetpack Compose के साथ आसानी से इंटिग्रेट किया जा सकता है.
Paging 3 पर माइग्रेट करने के फ़ायदे
Paging 3 में ये सुविधाएं शामिल हैं, जो लाइब्रेरी के पुराने वर्शन में मौजूद नहीं थीं:
- Kotlin coroutines और
Flowके लिए बेहतर सहायता. - रिस्पॉन्सिव यूज़र इंटरफ़ेस (यूआई) डिज़ाइन के लिए, लोड होने की स्थिति और गड़बड़ी के सिग्नल की बिल्ट-इन सुविधा. इसमें फिर से कोशिश करने और रीफ़्रेश करने की सुविधा भी शामिल है.
- रिपॉज़िटरी लेयर में सुधार. इसमें रद्द करने की सुविधा और डेटा सोर्स का आसान इंटरफ़ेस शामिल है.
- प्रज़ेंटेशन लेयर, सूची के सेपरेटर, पेज के लिए कस्टम ट्रांसफ़ॉर्मेशन, हेडर और फ़ुटर, और लेज़ी लिस्ट के लिए लोड होने की स्थिति वाले आइटम में सुधार.
अपने ऐप्लिकेशन को Paging 3 पर माइग्रेट करना
Paging 3 पर पूरी तरह माइग्रेट करने के लिए, आपको Paging 2 से इन मुख्य कॉम्पोनेंट को माइग्रेट करना होगा:
DataSourceक्लासPagedList- प्रज़ेंटेशन लेयर (से
LazyPagingItems)
हालांकि, Paging 3 के कुछ कॉम्पोनेंट, Paging के पुराने वर्शन के साथ काम करते हैं. खास तौर पर, Pager API, पुराने
DataSource ऑब्जेक्ट का इस्तेमाल, asPagingSourceFactory तरीके के साथ कर सकता है. इसका मतलब है कि आपके पास माइग्रेट करने के ये विकल्प हैं:
- अपने
DataSourceकोPagingSourceपर माइग्रेट किया जा सकता है. हालांकि, Paging के बाकी कॉम्पोनेंट में कोई बदलाव नहीं किया जा सकता. - अपने ऐप्लिकेशन को Paging 3 पर पूरी तरह माइग्रेट करने के लिए, Paging के सभी कॉम्पोनेंट को माइग्रेट किया जा सकता है.
इस पेज पर मौजूद सेक्शन में, आपके ऐप्लिकेशन की हर लेयर पर Paging कॉम्पोनेंट को माइग्रेट करने का तरीका बताया गया है.
DataSource क्लास
इस सेक्शन में, Paging के पुराने वर्शन को PagingSource पर माइग्रेट करने के लिए ज़रूरी सभी बदलावों के बारे में बताया गया है.
Paging 2 के PageKeyedDataSource, PositionalDataSource, और ItemKeyedDataSource को Paging 3 में, PagingSource API में शामिल कर दिया गया है. पुराने एपीआई क्लास के लोड करने के सभी तरीकों को, PagingSource में एक load तरीके में शामिल कर दिया गया है. इससे कोड की डुप्लीकेसी कम होती है, क्योंकि पुराने एपीआई क्लास के कॉम्पोनेंट में, लोड करने के तरीकों के लिए इस्तेमाल की जाने वाली ज़्यादातर लॉजिक एक जैसी होती है.
Paging 3 में, लोड करने के सभी तरीकों के पैरामीटर को LoadParams सील की गई क्लास से बदल दिया गया है. इसमें लोड करने के हर टाइप के लिए सबक्लास शामिल हैं. अगर आपको अपने load तरीके में लोड करने के टाइप के बीच अंतर करना है, तो देखें कि LoadParams की कौनसी सबक्लास पास की गई है: LoadParams.Refresh,LoadParams.Prepend, या LoadParams.Append.
PagingSource को लागू करने के बारे में ज़्यादा जानने के लिए, डेटा सोर्स तय करना लेख पढ़ें.
रीफ़्रेश करने के बटन
PagingSource के कॉम्पोनेंट को यह तय करना होगा कि लोड किए गए पेज वाले डेटा के बीच से रीफ़्रेश कैसे किया जाए. इसके लिए,
getRefreshKey
को लागू करें, ताकि state.anchorPosition को हाल ही में
ऐक्सेस किए गए इंडेक्स के तौर पर इस्तेमाल करके, सही शुरुआती बटन को मैप किया जा सके.
// 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
}
सूची में बदलाव
Paging लाइब्रेरी के पुराने वर्शन में, पेज वाले डेटा में बदलाव करने के लिए, इन तरीकों का इस्तेमाल किया जाता है:
DataSource.mapDataSource.mapByPageDataSource.Factory.mapDataSource.Factory.mapByPage
Paging 3 में, सभी बदलाव PagingData पर ऑपरेटर के तौर पर लागू किए जाते हैं. अगर पेज वाली सूची में बदलाव करने के लिए, ऊपर दी गई सूची में से किसी भी तरीके का इस्तेमाल किया जाता है, तो आपको DataSource से PagingData में बदलाव करने की लॉजिक को ले जाना होगा. इसके लिए, नए PagingSource का इस्तेमाल करके Pager बनाया जाता है.
Paging 3 का इस्तेमाल करके, पेज वाले डेटा में बदलाव करने के बारे में ज़्यादा जानने के लिए, डेटा स्ट्रीम में बदलाव करना लेख पढ़ें.
PagedList
इस सेक्शन में, Paging के पुराने वर्शन को Paging 3 में Pager और PagingData का इस्तेमाल करने के लिए माइग्रेट करने के लिए ज़रूरी सभी बदलावों के बारे में बताया गया है.
PagedListBuilder क्लास
Paging 2 के मौजूदा PagedList की जगह, PagingData का इस्तेमाल किया जाता है. PagingData पर माइग्रेट करने के लिए, आपको ये अपडेट करने होंगे:
- पेजिंग कॉन्फ़िगरेशन को
PagedList.ConfigसेPagingConfigमें ले जाया गया है. - बिल्डर की पुरानी क्लास को,
Pagerकी एक क्लास में शामिल कर दिया गया है. Pagerप्रॉपर्टी के साथ,Flow<PagingData>को दिखाता है..flow
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)
Paging 3 का इस्तेमाल करके, PagingData ऑब्जेक्ट की रिएक्टिव स्ट्रीम सेट अप करने के बारे में ज़्यादा जानने के लिए, PagingData की स्ट्रीम सेट अप करना लेख पढ़ें.
लेयर्ड सोर्स के लिए BoundaryCallback
Paging 3 में, नेटवर्क और डेटाबेस से पेजिंग के लिए हैंडलर के तौर पर, PagedList.BoundaryCallback की जगह RemoteMediator का इस्तेमाल किया जाता है.
Paging 3 में, नेटवर्क और डेटाबेस से पेजिंग के लिए RemoteMediator का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, Android Paging कोडलैब देखें.
LazyPagingItems
इस सेक्शन में, Paging के पुराने वर्शन को Paging 3 के LazyPagingItems का इस्तेमाल करने के लिए माइग्रेट करने के लिए ज़रूरी सभी बदलावों के बारे में बताया गया है.
Paging 3, PagingData की नई स्ट्रीम को मैनेज करने के लिए, collectAsLazyPagingItems उपलब्ध कराता है. अपनी प्रज़ेंटेशन लेयर को माइग्रेट करने के लिए, paging-compose आर्टफ़ैक्ट और collectAsLazyPagingItems का इस्तेमाल करें. इससे PagingData आइटम इकट्ठा किए जा सकते हैं और उन्हें @Composable फ़ंक्शन में दिखाया जा सकता है.
LazyPagingItems के बारे में ज़्यादा जानने के लिए, पेज वाला डेटा लोड करना और दिखाना लेख पढ़ें.
सूची में अंतर और अपडेट
अगर फ़िलहाल, सूची में अंतर करने के लिए कस्टम लॉजिक का इस्तेमाल किया जा रहा है, तो इसके बजाय Paging 3 में दिए गए LazyPagingItems का इस्तेमाल करने के लिए, अपने कॉम्पोनेंट को माइग्रेट करें. यह पक्का करने के लिए कि सूची में अंतर सही तरीके से हो, अपनी लेज़ी लिस्ट में आइटम की कुंजी तय करें:
@Composable
fun UserScreen(viewModel: UserViewModel) {
// Collects the Flow into a LazyPagingItems object
val lazyPagingItems = viewModel.pager.flow.collectAsLazyPagingItems()
UserList(lazyPagingItems)
}
@Composable
fun UserScreen(viewModel: UserViewModel) {
val lazyPagingItems = viewModel.pager.flow.collectAsLazyPagingItems()
UserList(lazyPagingItems)
}
@Composable
fun UserList(lazyPagingItems: LazyPagingItems<User>) {
LazyColumn {
items(
count = lazyPagingItems.itemCount,
// Provide a stable key for each item, similar to DiffUtil in Views
key = lazyPagingItems.itemKey { user -> user.id }
) { index ->
val user = lazyPagingItems[index]
if (user != null) {
UserRow(user = user)
}
}
}
}
आइटम की कुंजियों के बारे में ज़्यादा जानने के लिए, आइटम की कुंजियां लेख पढ़ें.
लोड होने की स्थितियां
Paging 3 में, लोड होने की स्थितियों के लिए हेडर या फ़ुटर दिखाने के लिए, अलग अडैप्टर की ज़रूरत नहीं होती. LazyPagingItems ऑब्जेक्ट, loadState प्रॉपर्टी दिखाता है. इसे सीधे LazyColumn में देखा जा सकता है.
LazyColumn {
// ... items(lazyPagingItems) go here ...
// Show loading spinner at bottom of list when appending data
if (lazyPagingItems.loadState.append is LoadState.Loading) {
item {
CircularProgressIndicator(modifier = Modifier.fillMaxWidth())
}
}
}
अन्य संसाधन
Paging लाइब्रेरी के बारे में ज़्यादा जानने के लिए, ये अन्य संसाधन देखें:
दस्तावेज़
कॉन्टेंट देखें
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर, लिंक का टेक्स्ट दिखता है
- पेज वाला डेटा लोड करना और दिखाना
- पेज वाला डेटा इकट्ठा करना
- नेटवर्क और डेटाबेस से पेजिंग