ساخت PagedListAdapter
ساخت PagedListAdapter
برای اکران این PagedList در یک RecyclerView به یک PagedListAdapter نیاز طراحی اپلیکیشن در مشهد داریم.
کلیک نمائید
پیرو تعریف و تمجید دقیقی از این کلاس را از مستندات قانونی ارائه کردهایم. RecyclerView.Adapter یک کلاس شالوده برای ارائه دادههای کاغذبندی گردیده از PagedLists ها در یک RecyclerView میباشد. به این ترتیب یک PersonAdapter ساخت می کنیم که PagedListAdapter را پیشرفت میدهد.
import android.arch.paging.PagedListAdapter
import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.chikeandroid.pagingtutsplus.R
import com.chikeandroid.pagingtutsplus.data.Person
import kotlinx.android.synthetic.main.item_person.view.*
class PersonAdapter(val context: Context) : PagedListAdapter(PersonDiffCallback()) {
override fun onBindViewHolder(holderPerson: PersonViewHolder, position: Int) {
var person = getItem(position)
if (person == null) {
holderPerson.clear()
} else {
holderPerson.bind(person)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PersonViewHolder {
return PersonViewHolder(LayoutInflater.from(context).inflate(R.layout.item_person,
parent, false))
}
class PersonViewHolder (view: View) : RecyclerView.ViewHolder(view) {
var tvName: TextView = view.name
fun bind(person: Person) {
tvName.text = person.name
}
fun clear() {
tvName.text = null
}
}
}
PagedListAdapter دقیقاً همچون هر زیرکلاس دیگری از RecyclerView.Adapter به کارگیری می شو. به ذکر دیگر می بایست متدهای ()onCreateViewHolder و ()onBindViewHolder را پیادهسازی فرمایید. برای وسیع ساختن کلاس مجرد PagedListAdapter می بایست نوع PageLists و همینطور کلاسی که ViewHolder را برای به کارگیری از سوی آداپتور توسعه می دهد را در تولیدکننده آن انتخاب فرمایید. راجعبه نمونه ما Person و PersonViewHolder را به ترتیب تحت عنوان آرگومانهای اولیه و دوم ارسال می کنیم.
دقت داشته باشید PagedListAdapter شمارا مکلف مینماید که یک DiffUtil.ItemCallback به آفریننده PageListAdapter ارسال نمایید. DiffUtil یک کلاس کاربردی RecyclerView میباشد که قادر است اختلاف دربین دو لیست را احتساب کرده و یک لیست از عملیاتهای بهروزرسانی در خروجی ارائه نماید که لیست در آغاز را به لیست دوم تبدیل مینماید. ItemCallback یک کلاس استاتیک مجرد درونی میباشد که برای به حساب آوردن اختلاف در بین دو گزینه غیر تهی در یک لیست به کارگیری میگردد.
ما به صورت خاص PersonDiffCallback را برای آفریننده PagedListAdapter خویش ارائه میکنیم.
import android.support.v7.util.DiffUtil
import com.chikeandroid.pagingtutsplus.data.Person
class PersonDiffCallback : DiffUtil.ItemCallback() {
override fun areItemsTheSame(oldItem: Person, newItem: Person): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Person?, newItem: Person?): Boolean {
return oldItem == newItem
}
}
ازآنجاکه ما درگیر پیادهسازی DiffUtil.ItemCallback هستیم می بایست دو مشی ()areItemsTheSame و ()areContentsTheSame را پیادهسازی کنیم:
areItemsTheSame برای تحقیق این که دوشی، گزینه یکسانی ارائه می دهند یا این که خیر فراخوانی میگردد. برای مثال درصورتی که موردهای شما id های یکتایی داشته باشند، این اسلوب کمیت id آن ها را پژوهش مینماید. این سیاق، درحالتی که که دو گزینه، شیء یکسانی را اکران دهند مقدار true و در مواقعی که متعدد باشند مقدار flase گشوده میگرداند.
areContentsTheSame برای رسیدگی این که آیا دو مورد دادههای یکسانی داراهستند فراخوانی می شود. درحالتی که که محتوای دو مورد یکسان باشد، این مشی مقدار true و در غیر این شکل مقدار false گشوده میگرداند.
کلاس درونی PersonViewHolder ما فقط یک RecyclerView.ViewHolder نوعی میباشد. این کلاس مسئول اتصال دادههای ما یحتاج سبک به ویجتهای یک ستون در لیست ما میباشد.
class PersonAdapter(val context: Context) : PagedListAdapter(PersonDiffCallback()) {
// ...
class PersonViewHolder (view: View) : RecyclerView.ViewHolder(view) {
var tvName: TextView = view.name
fun bind(person: Person) {
tvName.text = person.name
}
fun clear() {
tvName.text = null
}
}
}
8. اکران سود
در سیاق ()onCreate اکتیویتی MainActivity فقطً بایستی شغل های تحت را اجرا دهیم:
مقداردهی نخستین فیلد viewModel با به کار گیری از کلاس کاربردی ViewModelProviders
ساختوساز یک نوبت از PersonAdapter
تنظیمات RecyclerView
اتصال PersonAdapter به RecyclerView
مشاهده LiveData و تحویل شیءهای PagedList روی PersonAdapter با فراخوانی submitList().
import android.arch.lifecycle.Observer
import android.arch.lifecycle.ViewModelProviders
import android.Operating System.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.RecyclerView
import com.chikeandroid.pagingtutsplus.adapter.PersonAdapter
import com.chikeandroid.pagingtutsplus.viewmodels.PersonsViewModel
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: PersonsViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProviders.of(this).get(PersonsViewModel::class.java)
val adapter = PersonAdapter(this)
findViewById(R.id.name_list).adapter = adapter
subscribeUi(adapter)
}
private fun subscribeUi(adapter: PersonAdapter) {
viewModel.getPersonLiveData().observe(this, Observer { names ->
if (names != null) adapter.submitList(names)
})
}
}
در غایت هنگامی که نرم افزار خویش را اعمال می کنید، فیض به طور پایین خواهد بود:
هنگام اسکرول کردن Room میتوانید با لود 50 مورد آجل در هر فرصت از بروز توقف پرهیز نماید و این گزینهها را در دست PersonAdapter ما که زیرکلاس PagingListAdapter میباشد قرار دهد. البته اعتنا داشته باشید که تمامی منابع داده بهسرعت لود نمیشوند. سرعت لود به اقتدار پردازشی دستگاه اندرویدی نیز بستگی دارااست.
9. یکدستسازی با RxJava
در صورتی از RxJava در پروژه خویش به کارگیری میکنید یا این که قصد داراست اینگونه نمایید، کتابخانه Paging یک قسمت موثر دیگر نیز به اسم RxPagedListBuilder دارااست. از این نصیب به مکان LivePagedListBuilder برای مدد RxJava می توانید به کار گیری فرمایید.
کافی میباشد یک نوبت از RxPagedListBuilder ساختوساز نمائید که به عبارتی آرگومانهایی که برای LivePagedListBuilder وجود دارااست ارائه می دهد، یعنی DataSource.Factory و اندازه ورقه. بعد میتوانید به ترتیب ()buildObservable یا این که ()buildFlowable را برای رجوع تحت عنوان یک Observable یا این که Flowable برای PagedList خویش فراخوانی فرمایید.
برای ارائه مصرح Scheduler برای عملیات لود دادهها می توانید روال setter را برای ()setFetchScheduler فراخوانی نمایید. همینطور جهت ارائه Scheduler برای تحویل سود کافی میباشد ()setNotifyScheduler را فراخوانی فرمایید. به صورت پیشفرض ()setNotifyScheduler به صورت پیشفرض روی برای ترد UI انجام می شود در حالی که () setFetchScheduler به صورت پیشفرض روی استخر ترد I/O قراردارد.
کلام نهایی
دراین راهنما نحوه به کار گیری از کامپوننت Paging از در میان کامپوننتهای معماری اندروید (که بخشی از Android Jetpack میباشد) را به یار و همدم Room آموختیم. به این ترتیب میتوانیم دسته دادههای حجیم را به صورت کارآمدی از مقرهای داده محلی لود کنیم تا هنگام اسکرول کردن در یک لیست در RecyclerView، تجارب کاربری خل وچل را در مشت مخاطب در اختیار بگذاریم.