نمایش لیست های صفحه بندی شده

این راهنما مبتنی بر نمای کلی کتابخانه صفحه‌بندی است، و توضیح می‌دهد که چگونه می‌توانید فهرست‌هایی از اطلاعات را در رابط کاربری برنامه خود به کاربران ارائه دهید، به‌ویژه زمانی که این اطلاعات تغییر می‌کنند.

رابط کاربری خود را به مدل view خود وصل کنید

همانطور که در قطعه کد زیر نشان داده شده است، می توانید نمونه ای از LiveData<PagedList> به یک PagedListAdapter متصل کنید:

کاتلین

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 شما فقط باید به یک آیتم ارائه شده خاص متصل شود:

کاتلین

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() را نشان می‌دهد که فیلدهای شی مرتبط را با هم مقایسه می‌کند:

کاتلین

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 از عملکرد متفاوت آداپتور Paging Library استفاده کنید.

متغیرهایی را در رابط کاربری خود ارائه دهید

در مواردی که می‌خواهید رابط کاربری شما قبل از اینکه برنامه شما واکشی داده‌ها را تمام کند، فهرستی را نمایش دهد، می‌توانید موارد فهرست مکان‌نما را به کاربران خود نشان دهید. PagedList این مورد را با ارائه داده‌های آیتم فهرست به‌عنوان null تا زمانی که داده‌ها بارگذاری شود، مدیریت می‌کند.

مکان‌گردان‌ها مزایای زیر را دارند:

  • پشتیبانی از نوارهای پیمایش: PagedList تعداد آیتم های لیست را به PagedListAdapter ارائه می دهد. این اطلاعات به آداپتور اجازه می دهد تا نوار پیمایشی را ترسیم کند که اندازه کامل لیست را نشان می دهد. با بارگیری صفحات جدید، نوار اسکرول نمی پرد زیرا اندازه لیست شما تغییر نمی کند.
  • بدون نیاز به بارگیری چرخنده: از آنجایی که اندازه لیست از قبل مشخص است، نیازی به هشدار دادن به کاربران در مورد بارگیری موارد بیشتری وجود ندارد. خود جایگاه‌داران آن اطلاعات را منتقل می‌کنند.

با این حال، قبل از افزودن پشتیبانی برای متغیرهایی، پیش‌شرط‌های زیر را در نظر داشته باشید:

  • به مجموعه داده‌های قابل شمارش نیاز دارد: نمونه‌هایی از DataSource از کتابخانه تداوم اتاق می‌توانند به طور مؤثر موارد خود را شمارش کنند. با این حال، اگر از یک راه‌حل ذخیره‌سازی محلی سفارشی یا معماری داده فقط شبکه استفاده می‌کنید، ممکن است تعیین تعداد موارد مجموعه داده‌های شما گران یا حتی غیرممکن باشد.
  • نیاز به آداپتور برای حساب کردن آیتم‌های بارگیری نشده: آداپتور یا مکانیسم ارائه‌ای که برای تهیه فهرست برای تورم استفاده می‌کنید، باید آیتم‌های لیست پوچ را مدیریت کند. برای مثال، هنگام اتصال داده به ViewHolder ، باید مقادیر پیش‌فرض را برای نمایش داده‌های بارگیری نشده ارائه کنید.
  • به نماهای آیتم‌هایی با اندازه یکسان نیاز دارد: اگر اندازه آیتم‌های فهرست بر اساس محتوایشان تغییر کند، مانند به‌روزرسانی‌های شبکه‌های اجتماعی، تغییر رنگ بین آیتم‌ها خوب به نظر نمی‌رسد. ما اکیداً پیشنهاد می‌کنیم که متغیرهای مکان را در این مورد غیرفعال کنید.

بازخورد ارائه دهید

نظرات و ایده های خود را از طریق این منابع با ما در میان بگذارید:

ردیاب مشکل
مشکلات را گزارش کنید تا بتوانیم اشکالات را برطرف کنیم.

منابع اضافی

برای کسب اطلاعات بیشتر در مورد کتابخانه صفحه بندی، به منابع زیر مراجعه کنید.

نمونه ها

Codelabs

ویدیوها

{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}