পেজিং 3 এ স্থানান্তর করুন

পেজিং ৩, পেজিং লাইব্রেরির পূর্ববর্তী সংস্করণগুলো থেকে উল্লেখযোগ্যভাবে ভিন্ন। এই সংস্করণটি উন্নত কার্যকারিতা, কোটলিন কো-রুটিন ও Flow -এর জন্য প্রথম-শ্রেণীর সমর্থন এবং জেটপ্যাক কম্পোজের সাথে নির্বিঘ্ন ইন্টিগ্রেশন প্রদান করে।

পেজিং ৩-এ স্থানান্তরের সুবিধাসমূহ

পেজিং ৩-এ নিম্নলিখিত বৈশিষ্ট্যগুলো অন্তর্ভুক্ত রয়েছে, যা লাইব্রেরির পূর্ববর্তী সংস্করণগুলোতে ছিল না:

  • কোটলিন কো-রুটিন এবং Flow এর জন্য প্রথম শ্রেণীর সমর্থন।
  • রেসপন্সিভ UI ডিজাইনের জন্য বিল্ট-ইন লোড স্টেট এবং এরর সিগন্যাল, যার মধ্যে রিট্রাই এবং রিফ্রেশ কার্যকারিতাও অন্তর্ভুক্ত।
  • রিপোজিটরি লেয়ারে উন্নতিসাধন, যার মধ্যে রয়েছে বাতিল করার সুবিধা এবং একটি সরলীকৃত ডেটা সোর্স ইন্টারফেস।
  • প্রেজেন্টেশন লেয়ার, লিস্ট সেপারেটর, কাস্টম পেজ ট্রান্সফর্ম, হেডার ও ফুটার এবং লেজি লিস্টের জন্য স্টেট আইটেম লোড করার ক্ষেত্রে উন্নতি সাধন করা হয়েছে।

আপনার অ্যাপটিকে পেজিং ৩-এ স্থানান্তর করুন

পেজিং ৩-এ সম্পূর্ণরূপে স্থানান্তরিত হতে হলে, আপনাকে পেজিং ২ থেকে এই প্রধান উপাদানগুলো স্থানান্তর করতে হবে:

  • DataSource ক্লাস
  • PagedList
  • প্রেজেন্টেশন লেয়ার ( LazyPagingItems এর জন্য)

তবে, পেজিং ৩-এর কিছু উপাদান পেজিং-এর পূর্ববর্তী সংস্করণগুলোর সাথে পশ্চাৎ-সামঞ্জস্যপূর্ণ। বিশেষ করে, Pager এপিআই asPagingSourceFactory মেথডের মাধ্যমে পুরোনো DataSource অবজেক্টগুলো ব্যবহার করতে পারে। এর মানে হলো, আপনার কাছে নিম্নলিখিত মাইগ্রেশন বিকল্পগুলো রয়েছে:

  • আপনি আপনার DataSource PagingSource স্থানান্তর করতে পারেন, কিন্তু আপনার পেজিং বাস্তবায়নের বাকি অংশ অপরিবর্তিত রাখতে পারেন।
  • আপনার অ্যাপটিকে সম্পূর্ণরূপে পেজিং ৩-এ মাইগ্রেট করতে আপনি পুরো পেজিং ইমপ্লিমেন্টেশনটি মাইগ্রেট করতে পারেন।

এই পৃষ্ঠার বিভাগগুলিতে আপনার অ্যাপের প্রতিটি স্তরে পেজিং উপাদানগুলি কীভাবে স্থানান্তর করতে হয় তা ব্যাখ্যা করা হয়েছে।

DataSource ক্লাস

এই বিভাগে একটি পুরোনো পেজিং ইমপ্লিমেন্টেশনকে PagingSource ব্যবহারে স্থানান্তরিত করার জন্য প্রয়োজনীয় সমস্ত পরিবর্তন বর্ণনা করা হয়েছে।

পেজিং ২-এর PageKeyedDataSource , PositionalDataSource এবং ItemKeyedDataSource কে পেজিং ৩-এ PagingSource API-এর অধীনে একত্রিত করা হয়েছে। পুরোনো সমস্ত API ক্লাসের লোডিং মেথডগুলোকে PagingSource এর একটিমাত্র load মেথডে একত্রিত করা হয়েছে। এর ফলে কোডের পুনরাবৃত্তি কমে যায়, কারণ পুরোনো API ক্লাসগুলোর ইমপ্লিমেন্টেশনে থাকা লোডিং মেথডগুলোর লজিকের বেশিরভাগই প্রায়শই একই রকম হয়ে থাকে।

পেজিং ৩-এ সমস্ত লোডিং মেথড প্যারামিটার একটি LoadParams সিলড ক্লাস দ্বারা প্রতিস্থাপিত হয়, যার মধ্যে প্রতিটি লোড টাইপের জন্য সাবক্লাস অন্তর্ভুক্ত থাকে। আপনার load মেথডে লোড টাইপগুলোর মধ্যে পার্থক্য করার প্রয়োজন হলে, পরীক্ষা করে দেখুন LoadParams এর কোন সাবক্লাসটি পাস করা হয়েছে: LoadParams.Refresh , LoadParams.Prepend , অথবা LoadParams.Append

PagingSource বাস্তবায়ন সম্পর্কে আরও জানতে, "একটি ডেটা উৎস সংজ্ঞায়িত করুন" দেখুন।

রিফ্রেশ কী

PagingSource এর ইমপ্লিমেন্টেশনগুলিতে অবশ্যই সংজ্ঞায়িত করতে হবে যে লোড হওয়া পেজড ডেটার মাঝখান থেকে রিফ্রেশ কীভাবে পুনরায় শুরু হবে। এটি করার জন্য, সবচেয়ে সম্প্রতি অ্যাক্সেস করা ইনডেক্স হিসাবে state.anchorPosition ব্যবহার করে সঠিক প্রাথমিক কী ম্যাপ করতে getRefreshKey ইমপ্লিমেন্ট করুন।

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

তালিকা রূপান্তর

পেজিং লাইব্রেরির নিম্নতর সংস্করণগুলিতে, পেজ করা ডেটার রূপান্তর নিম্নলিখিত পদ্ধতিগুলির উপর নির্ভর করে:

  • DataSource.map
  • DataSource.mapByPage
  • DataSource.Factory.map
  • DataSource.Factory.mapByPage

পেজিং ৩-এ, সমস্ত রূপান্তর PagingData উপর অপারেটর হিসেবে প্রয়োগ করা হয়। যদি আপনি আপনার পেজ করা তালিকাটিকে রূপান্তর করার জন্য পূর্ববর্তী তালিকার কোনো পদ্ধতি ব্যবহার করেন, তবে আপনার নতুন PagingSource ব্যবহার করে Pager তৈরি করার সময় আপনাকে অবশ্যই আপনার রূপান্তরের লজিকটি DataSource থেকে PagingData তে স্থানান্তর করতে হবে।

পেজিং ৩ ব্যবহার করে পেজ করা ডেটাতে রূপান্তর প্রয়োগ করার বিষয়ে আরও জানতে, ‘ডেটা স্ট্রিম রূপান্তর করুন’ দেখুন।

PagedList

এই বিভাগে, পেজিং ৩-এ Pager এবং PagingData ব্যবহার করার জন্য একটি পুরোনো পেজিং ইমপ্লিমেন্টেশনকে মাইগ্রেট করতে প্রয়োজনীয় সমস্ত পরিবর্তন বর্ণনা করা হয়েছে।

PagedListBuilder ক্লাস

PagingData Paging 2-এর বিদ্যমান PagedList প্রতিস্থাপন করে। PagingData তে মাইগ্রেট করতে হলে, আপনাকে নিম্নলিখিত বিষয়গুলো আপডেট করতে হবে:

  • পেজিং কনফিগারেশন PagedList.Config থেকে PagingConfig এ স্থানান্তরিত হয়েছে।
  • পুরোনো বিল্ডার ক্লাসগুলোকে একত্রিত করে একটি একক Pager ক্লাস তৈরি করা হয়েছে।
  • Pager তার .flow প্রপার্টির মাধ্যমে Flow<PagingData> একটি অবজারভেবল প্রকাশ করে।
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 অবজেক্টের একটি রিঅ্যাক্টিভ স্ট্রিম সেট আপ করার বিষয়ে আরও জানতে, “Set up a stream of PagingData” দেখুন।

স্তরযুক্ত উৎসগুলির জন্য BoundaryCallback

পেজিং ৩-এ, নেটওয়ার্ক এবং ডাটাবেস থেকে পেজিং-এর হ্যান্ডলার হিসেবে PagedList.BoundaryCallback পরিবর্তে RemoteMediator ব্যবহৃত হয়।

পেজিং ৩-এ নেটওয়ার্ক এবং ডেটাবেস থেকে পেজ করার জন্য RemoteMediator ব্যবহারের বিষয়ে আরও জানতে, অ্যান্ড্রয়েড পেজিং কোডল্যাব দেখুন।

LazyPagingItems

এই বিভাগে, পেজিং ৩-এর LazyPagingItems ব্যবহার করার জন্য একটি পুরোনো পেজিং ইমপ্লিমেন্টেশনকে মাইগ্রেট করতে প্রয়োজনীয় সমস্ত পরিবর্তন বর্ণনা করা হয়েছে।

পেজিং ৩ নতুন PagingData ফ্লো পরিচালনা করার জন্য collectAsLazyPagingItems প্রদান করে। আপনার প্রেজেন্টেশন লেয়ার মাইগ্রেট করতে, paging-compose আর্টিফ্যাক্ট এবং collectAsLazyPagingItems ব্যবহার করে PagingData আইটেমগুলো সংগ্রহ করুন এবং @Composable ফাংশনগুলোতে সেগুলো প্রদর্শন করুন।

LazyPagingItems সম্পর্কে আরও জানতে, "পেজ করা ডেটা লোড এবং প্রদর্শন করুন" দেখুন।

তালিকার পার্থক্য এবং আপডেট

আপনি যদি বর্তমানে কাস্টম লিস্ট ডিফারেন্সিং লজিক ব্যবহার করেন, তবে আপনার ইমপ্লিমেন্টেশনটি পরিবর্তন করে পেজিং ৩-এ প্রদত্ত 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)
            }
        }
    }
}

আইটেম কী সম্পর্কে আরও তথ্যের জন্য, আইটেম কী দেখুন।

লোড হওয়ার অবস্থা

পেজিং ৩-এ, লোডিং স্টেট দেখানোর জন্য হেডার বা ফুটার প্রদর্শন করতে আপনার কোনো আলাদা অ্যাডাপ্টারের প্রয়োজন নেই। 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())
        }
    }
}

অতিরিক্ত সম্পদ

পেজিং লাইব্রেরি সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্সগুলো দেখুন:

ডকুমেন্টেশন

বিষয়বস্তু দেখুন

{% হুবহু %} {% endverbatim %} {% হুবহু %} {% endverbatim %}