این راهنما مبتنی بر نمای کلی کتابخانه صفحهبندی است، و توضیح میدهد که چگونه میتوانید فهرستهایی از اطلاعات را در رابط کاربری برنامه خود به کاربران ارائه دهید، بهویژه زمانی که این اطلاعات تغییر میکنند.
رابط کاربری خود را به مدل 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
ویدیوها
- Android Jetpack: لیست های بی نهایت را با RecyclerView و Paging مدیریت کنید (Google I/O '18)
- Android Jetpack: پیجینگ
برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- نمای کلی کتابخانه Paging 2
- مهاجرت به صفحه 3
- داده های صفحه بندی شده را جمع آوری کنید