পেজিং ৩ (ভিউ) এ স্থানান্তরিত করুন

ধারণা এবং জেটপ্যাক কম্পোজ বাস্তবায়ন

পেজিং ৩, পেজিং লাইব্রেরির পূর্ববর্তী সংস্করণগুলো থেকে উল্লেখযোগ্যভাবে ভিন্ন। এই সংস্করণটি উন্নত কার্যকারিতা প্রদান করে এবং পেজিং ২ ব্যবহারের সাধারণ অসুবিধাগুলোর সমাধান করে। যদি আপনার অ্যাপ ইতিমধ্যেই পেজিং লাইব্রেরির কোনো পূর্ববর্তী সংস্করণ ব্যবহার করে থাকে, তবে পেজিং ৩-এ স্থানান্তরের বিষয়ে আরও জানতে এই পৃষ্ঠাটি পড়ুন।

আপনার অ্যাপে যদি পেজিং লাইব্রেরির প্রথম সংস্করণ হিসেবে পেজিং ৩ ব্যবহার করা হয়ে থাকে, তাহলে এর প্রাথমিক ব্যবহারবিধি জানতে ‘পেজ করা ডেটা লোড ও প্রদর্শন’ দেখুন।

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

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

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

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

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

  • DataSource ক্লাস
  • PagedList
  • PagedListAdapter

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

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

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

অভিবাসনের সংক্ষিপ্ত বিবরণ

আপনার RecyclerView ইমপ্লিমেন্টেশনটি অক্ষুণ্ণ রেখে সম্পূর্ণরূপে পেজিং ৩-এ স্থানান্তরিত হতে হলে, আপনাকে নিম্নলিখিত উপাদানগুলি আপডেট করতে হবে:

পেজিং ২ উপাদান

পৃষ্ঠা ৩ প্রতিস্থাপন

PageKeyedDataSource

PagingSource

PagedListAdapter

PagingDataAdapter

LivePagedListBuilder

Pager

BoundaryCallback

RemoteMediator

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.
@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;
}

জাভা (গুয়াভা/লাইভডেটা)

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

পৃষ্ঠা তালিকা

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

PagedListBuilder ক্লাস

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

  • পেজিং কনফিগারেশন PagedList.Config থেকে PagingConfig এ স্থানান্তরিত হয়েছে।
  • LivePagedListBuilder এবং RxPagedListBuilder একত্রিত করে একটি একক Pager ক্লাস তৈরি করা হয়েছে।
  • Pager তার flow প্রপার্টির মাধ্যমে একটি অবজার্ভেবল Flow<PagingData> প্রকাশ করে। RxJava এবং LiveData ভ্যারিয়েন্টগুলোও এক্সটেনশন প্রপার্টি হিসেবে উপলব্ধ, যেগুলোকে জাভা থেকে স্ট্যাটিক মেথডের মাধ্যমে কল করা যায় এবং এগুলো যথাক্রমে paging-rxjava*paging-runtime মডিউল থেকে সরবরাহ করা হয়।

জাভা (আরএক্সজাভা)

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

জাভা (গুয়াভা/লাইভডেটা)

// 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 অবজেক্টের একটি রিঅ্যাক্টিভ স্ট্রিম সেট আপ করার বিষয়ে আরও জানতে, “Set up a stream of PagingData” দেখুন।

PagedListAdapter

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

পেজিং ২-এ একটি PagedList RecyclerView এর সাথে বাইন্ড করতে PagedListAdapter ব্যবহৃত হয়। পেজিং ৩-এ PagedList পরিবর্তে PagingData ব্যবহৃত হয়।

পেজিং ৩ নতুন PagingData রিঅ্যাক্টিভ স্ট্রিমগুলো পরিচালনা করার জন্য PagingDataAdapter প্রদান করে। এছাড়া, PagedListAdapter এবং PagingDataAdapter ইন্টারফেস একই। PagedListAdapter থেকে PagingDataAdapter মাইগ্রেট করতে, আপনার PagedListAdapter এর ইমপ্লিমেন্টেশন পরিবর্তন করে এর পরিবর্তে PagingDataAdapter এক্সটেন্ড করুন।

PagingDataAdapter সম্পর্কে আরও জানতে, Define a RecyclerView adapter দেখুন।

AsyncPagedListDiffer

আপনি যদি বর্তমানে AsyncPagedListDiffer সহ একটি কাস্টম RecyclerView.Adapter ইমপ্লিমেন্টেশন ব্যবহার করে থাকেন, তাহলে এর পরিবর্তে Paging 3-এ প্রদত্ত AsyncPagingDataDiffer ব্যবহার করার জন্য আপনার ইমপ্লিমেন্টেশনটি মাইগ্রেট করুন:

কোটলিন

AsyncPagingDataDiffer(diffCallback, listUpdateCallback)

জাভা (আরএক্সজাভা)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

জাভা (গুয়াভা/লাইভডেটা)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);