পৃষ্ঠা অনুযায়ী তালিকা দেখান

এই নির্দেশিকা পেজিং লাইব্রেরি ওভারভিউ-এর উপর ভিত্তি করে তৈরি করা হয়েছে, যা বর্ণনা করে যে আপনি কীভাবে আপনার অ্যাপের UI-তে ব্যবহারকারীদের তথ্যের তালিকা উপস্থাপন করতে পারেন, বিশেষ করে যখন এই তথ্য পরিবর্তিত হয়।

আপনার ভিউ মডেলের সাথে UI কানেক্ট করুন

আপনি LiveData<PagedList>-এর একটি ইনস্ট্যান্স PagedListAdapter-এর সাথে কানেক্ট করতে পারবেন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

Kotlin

class ConcertActivity : AppCompatActivity() {
    private val adapter = ConcertAdapter()

    // Use the 'by viewModels()' Kotlin property delegate
    // from the activity-ktx artifact
    private val viewModel: ConcertViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState);
        viewModel.concerts.observe(this, Observer { adapter.submitList(it) })
    }
}

জাভা

public class ConcertActivity extends AppCompatActivity {
    private ConcertAdapter adapter = new ConcertAdapter();
    private ConcertViewModel viewModel;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewModel = new ViewModelProvider(this).get(ConcertViewModel.class);
        viewModel.concertList.observe(this, adapter::submitList);
    }
}

ডেটা সোর্স PagedList-এর নতুন ইনস্ট্যান্স প্রদান করলে, অ্যাক্টিভিটি এই অবজেক্টগুলি অ্যাডাপ্টারে পাঠায়। PagedListAdapter ইমপ্লিমেন্টেশন কীভাবে আপডেট গণনা করা হয় তা নির্ধারণ করে এবং এটি অটোমেটিক পেজিং ও লিস্ট ডিফারেন্সিং ম্যানেজ করে। তাই, আপনার ViewHolder শুধুমাত্র একটি নির্দিষ্ট আইটেমের সাথে বাইন্ড করতে হবে:

Kotlin

class ConcertAdapter() :
        PagedListAdapter<Concert, ConcertViewHolder>(DIFF_CALLBACK) {
    override fun onBindViewHolder(holder: ConcertViewHolder, position: Int) {
        val concert: Concert? = getItem(position)

        // Note that "concert" is a placeholder if it's null.
        holder.bindTo(concert)
    }

    companion object {
        private val DIFF_CALLBACK = ... // See Implement the diffing callback section.
    }
}

জাভা

public class ConcertAdapter
        extends PagedListAdapter<Concert, ConcertViewHolder> {
    protected ConcertAdapter() {
        super(DIFF_CALLBACK);
    }

    @Override
    public void onBindViewHolder(@NonNull ConcertViewHolder holder,
            int position) {
        Concert concert = getItem(position);

        // Note that "concert" can be null if it's a placeholder.
        holder.bindTo(concert);
    }

    private static DiffUtil.ItemCallback<Concert> DIFF_CALLBACK
            = ... // See Implement the diffing callback section.
}

PagedListAdapter একটি PagedList.Callback অবজেক্ট ব্যবহার করে পৃষ্ঠা লোড ইভেন্টগুলি পরিচালনা করে। ব্যবহারকারী স্ক্রল করলে, PagedListAdapter PagedList.loadAround()-কে কল করে যাতে সেটি PagedList-কে ইঙ্গিত দিতে পারে যে DataSource থেকে কোন আইটেম ফেচ করতে হবে।

ডিফিং কলব্যাক প্রয়োগ করুন

নিচে দেওয়া স্যাম্পেলে areContentsTheSame() ম্যানুয়ালি প্রয়োগ করে দেখানো হয়েছে, যা প্রাসঙ্গিক অবজেক্ট ফিল্ডের তুলনা করে:

Kotlin

private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Concert>() {
    // The ID property identifies when items are the same.
    override fun areItemsTheSame(oldItem: Concert, newItem: Concert) =
            oldItem.id == newItem.id

    // If you use the "==" operator, make sure that the object implements
    // .equals(). Alternatively, write custom data comparison logic here.
    override fun areContentsTheSame(
            oldItem: Concert, newItem: Concert) = oldItem == newItem
}

জাভা

private static DiffUtil.ItemCallback<Concert> DIFF_CALLBACK =
        new DiffUtil.ItemCallback<Concert>() {

    @Override
    public boolean areItemsTheSame(Concert oldItem, Concert newItem) {
        // The ID property identifies when items are the same.
        return oldItem.getId() == newItem.getId();
    }

    @Override
    public boolean areContentsTheSame(Concert oldItem, Concert newItem) {
        // Don't use the "==" operator here. Either implement and use .equals(),
        // or write custom data comparison logic here.
        return oldItem.equals(newItem);
    }
};

যেহেতু আপনার অ্যাডাপ্টারে আইটেম তুলনা করার সংজ্ঞা অন্তর্ভুক্ত থাকে, তাই নতুন PagedList অবজেক্ট লোড হলে অ্যাডাপ্টার অটোমেটিক এইসব আইটেমে হওয়া পরিবর্তন শনাক্ত করে। এর ফলে, অ্যাডাপ্টার আপনার RecyclerView অবজেক্টের মধ্যে দক্ষ আইটেম অ্যানিমেশন ট্রিগার করে।

অন্য ধরনের অ্যাডাপ্টার ব্যবহার করে ডিফারেন্সিয়েট করা হচ্ছে

আপনি যদি PagedListAdapter থেকে ইনহেরিট না করার সিদ্ধান্ত নেন—যেমন আপনি যখন এমন একটি লাইব্রেরি ব্যবহার করছেন যা নিজস্ব অ্যাডাপ্টার প্রদান করে—আপনি এখনও AsyncPagedListDiffer অবজেক্টের সাথে সরাসরি কাজ করে পেজিং লাইব্রেরি অ্যাডাপ্টারের ডিফারেন্সিং কার্যকারিতা ব্যবহার করতে পারেন।

আপনার UI-তে প্লেসহোল্ডার প্রদান করুন

আপনার অ্যাপ ডেটা ফেচ করা শেষ করার আগে আপনার UI-তে কোনও তালিকা দেখাতে চাইলে, ব্যবহারকারীদের প্লেসহোল্ডার তালিকার আইটেম দেখাতে পারেন। ডেটা লোড না হওয়া পর্যন্ত PagedList তালিকার আইটেম ডেটা null হিসেবে দেখানোর মাধ্যমে এই পরিস্থিতি ম্যানেজ করে।

প্লেসহোল্ডারের নিম্নলিখিত সুবিধা আছে:

  • স্ক্রলবারের জন্য সহায়তা: PagedList, PagedListAdapter-এ তালিকার আইটেমের সংখ্যা প্রদান করে। এই তথ্য অ্যাডাপ্টারকে একটি স্ক্রলবার আঁকতে দেয় যা তালিকার সম্পূর্ণ আকার প্রকাশ করে। নতুন পৃষ্ঠা লোড হওয়ার সাথে সাথে স্ক্রলবার জাম্প করে না কারণ আপনার তালিকার সাইজ পরিবর্তন হয় না।
  • লোডিং স্পিনার দেখানোর প্রয়োজন নেই: তালিকার সাইজ আগে থেকেই জানা থাকে, তাই আরও আইটেম লোড হচ্ছে বলে ব্যবহারকারীকে সতর্ক করার প্রয়োজন নেই। প্লেসহোল্ডারগুলি নিজে থেকেই সেই তথ্য প্রদান করে।

তবে, প্লেসহোল্ডারের জন্য সহায়তা যোগ করার আগে, নিম্নলিখিত পূর্বশর্তগুলি মনে রাখবেন:

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

মতামত জানান

এইসব রিসোর্সের মাধ্যমে আপনার মতামত ও আইডিয়া আমাদের সাথে শেয়ার করুন:

ইস্যু ট্র্যাকার
সমস্যার ব্যাপারে অভিযোগ জানান যাতে আমরা বাগ ঠিক করতে পারি।

অতিরিক্ত রিসোর্স

পেজিং লাইব্রেরি সম্পর্কে আরও জানতে, নিম্নলিখিত রিসোর্স পরামর্শ করুন।

নমুনা

কোডল্যাবস

ভিডিও