این کد لبه بخشی از دوره آموزشی Android Kotlin Fundamentals است. اگر به ترتیب روی کدها کار کنید، بیشترین ارزش را از این دوره خواهید گرفت. همه کدهای دوره در صفحه فرود کد لبه های کدهای Android Kotlin Fundamentals فهرست شده اند.
مقدمه
در این کد لبه، یاد میگیرید که چگونه یک هدر اضافه کنید که پهنای فهرست نمایش داده شده در RecyclerView
را بپوشاند. شما از برنامه ردیاب خواب از کدهای قبلی استفاده می کنید.
آنچه از قبل باید بدانید
- نحوه ساخت یک رابط کاربری پایه با استفاده از یک اکتیویتی، قطعات و نماها.
- نحوه پیمایش بین قطعات و نحوه استفاده از
safeArgs
برای انتقال داده ها بین قطعات. - مشاهده مدلها، مشاهده کارخانههای مدل، تبدیلها، و
LiveData
و ناظران آنها. - چگونه یک پایگاه داده
Room
ایجاد کنیم، یک DAO ایجاد کنیم و موجودیت ها را تعریف کنیم. - نحوه استفاده از کوروتین ها برای تعاملات پایگاه داده و سایر کارهای طولانی مدت.
- نحوه پیاده سازی
RecyclerView
اولیه باAdapter
،ViewHolder
و طرح بندی آیتم. - نحوه اجرای اتصال داده برای
RecyclerView
. - نحوه ایجاد و استفاده از آداپتورهای اتصال برای تبدیل داده ها.
- نحوه استفاده از
GridLayoutManager
- نحوه ضبط و مدیریت کلیک روی موارد در
RecyclerView.
چیزی که یاد خواهید گرفت
- نحوه استفاده از بیش از یک
ViewHolder
باRecyclerView
برای افزودن موارد با طرحبندی متفاوت. به طور خاص، نحوه استفاده ازViewHolder
دوم برای افزودن سرصفحه بالای موارد نمایش داده شده درRecyclerView
.
کاری که خواهی کرد
- بر اساس برنامه TrackMySleepQuality از کدهای قبلی در این سری ساخته شده است.
- سرصفحه ای اضافه کنید که پهنای صفحه را در بالای شب های خواب نمایش داده شده در
RecyclerView
قرار دهد.
برنامه ردیاب خواب که با آن شروع می کنید دارای سه صفحه است که با قطعات نشان داده شده است، همانطور که در شکل زیر نشان داده شده است.
اولین صفحه نمایش داده شده در سمت چپ دارای دکمه هایی برای شروع و توقف ردیابی است. صفحه نمایش برخی از داده های خواب کاربر را نشان می دهد. دکمه Clear تمام داده هایی را که برنامه برای کاربر جمع آوری کرده است برای همیشه حذف می کند. صفحه دوم که در وسط نشان داده شده است، برای انتخاب رتبه بندی کیفیت خواب است. صفحه سوم نمای جزئیات است که با ضربه زدن کاربر به یک مورد در شبکه باز می شود.
این برنامه از معماری ساده شده با کنترلر رابط کاربری، مدل نمایش و LiveData
و پایگاه داده Room
برای تداوم داده های خواب استفاده می کند.
در این کد لبه، شما یک هدر به شبکه موارد نمایش داده شده اضافه می کنید. صفحه اصلی نهایی شما به این صورت خواهد بود:
این کد لبه اصل کلی شامل مواردی که از طرحبندیهای متفاوتی در RecyclerView
استفاده میکنند را آموزش میدهد. یکی از مثالهای رایج، داشتن سرصفحه در فهرست یا شبکه است. یک لیست می تواند دارای یک سربرگ برای توصیف محتوای مورد باشد. یک لیست همچنین می تواند چندین سربرگ برای گروه بندی و جداسازی موارد در یک لیست داشته باشد.
RecyclerView
چیزی در مورد داده های شما یا نوع طرح بندی هر آیتم نمی داند. LayoutManager
موارد را روی صفحه مرتب می کند، اما آداپتور داده ها را برای نمایش تطبیق می دهد و دارندگان view را به RecyclerView
می دهد. بنابراین کدی را برای ایجاد هدر در آداپتور اضافه خواهید کرد.
دو روش برای اضافه کردن هدر
در RecyclerView
، هر آیتم در لیست مربوط به یک عدد شاخص است که از 0 شروع می شود. به عنوان مثال:
[دادههای واقعی] -> [نمایشهای آداپتور]
[0: Sleep Night] -> [0: Sleep Night]
[1: Sleep Night] -> [1: Sleep Night]
[2: Sleep Night] -> [2: Sleep Night]
یکی از راههای افزودن سرصفحه به فهرست این است که آداپتور خود را برای استفاده از ViewHolder
متفاوت با بررسی فهرستهایی که باید سرصفحه شما نشان داده شود، تغییر دهید. Adapter
مسئول پیگیری هدر خواهد بود. به عنوان مثال، برای نشان دادن سرصفحه در بالای جدول، باید یک ViewHolder
متفاوت برای سرصفحه در حین قرار دادن آیتم با نمایه صفر برگردانید. سپس تمام موارد دیگر با افست هدر مانند شکل زیر نگاشت می شوند.
[دادههای واقعی] -> [نمایشهای آداپتور]
[0: سرصفحه]
[0: Sleep Night] -> [1: Sleep Night]
[1: Sleep Night] -> [2: Sleep Night]
[2: Sleep Night] -> [3: Sleep Night.
راه دیگر برای افزودن هدرها این است که مجموعه داده پشتیبان را برای شبکه داده خود تغییر دهید. از آنجایی که تمام دادههایی که باید نمایش داده شوند در یک لیست ذخیره میشوند، میتوانید فهرست را طوری تغییر دهید که آیتمهایی را برای نشان دادن سرصفحه شامل شود. درک این موضوع کمی سادهتر است، اما باید در مورد نحوه طراحی اشیاء خود فکر کنید تا بتوانید انواع مختلف آیتمها را در یک لیست واحد ترکیب کنید. با اجرای این روش، آداپتور موارد ارسال شده به خود را نمایش می دهد. بنابراین مورد در موقعیت 0 یک هدر است و مورد در موقعیت 1 یک SleepNight
است که مستقیماً به آنچه روی صفحه است نگاشت می شود.
[دادههای واقعی] -> [نمایشهای آداپتور]
[0: سرصفحه] -> [0: سرصفحه]
[1: Sleep Night] -> [1: Sleep Night]
[2: Sleep Night] -> [2: Sleep Night]
[3: Sleep Night] -> [3: Sleep Night]
هر روش دارای مزایا و معایبی است. تغییر مجموعه داده تغییر زیادی در بقیه کدهای آداپتور ایجاد نمی کند و می توانید منطق هدر را با دستکاری لیست داده ها اضافه کنید. از سوی دیگر، استفاده از یک ViewHolder
متفاوت با بررسی شاخصها برای هدرها، آزادی بیشتری در طرحبندی هدر میدهد. همچنین به آداپتور اجازه میدهد تا بدون تغییر دادههای پشتیبان، نحوه تطبیق دادهها با نما را مدیریت کند.
در این کد لبه، شما RecyclerView
خود را به روز می کنید تا یک هدر در ابتدای لیست نمایش داده شود. در این حالت، برنامه شما از یک ViewHolder
متفاوت برای هدر نسبت به موارد داده استفاده می کند. برنامه فهرست فهرست را بررسی می کند تا مشخص کند از کدام ViewHolder
استفاده کند.
مرحله 1: یک کلاس DataItem ایجاد کنید
برای انتزاع نوع آیتم و اجازه دادن به آداپتور فقط با "اقلام"، می توانید یک کلاس دارنده داده ایجاد کنید که نشان دهنده یک SleepNight
یا یک Header
باشد. سپس مجموعه داده شما لیستی از موارد دارنده داده خواهد بود.
میتوانید برنامه شروع را از GitHub دریافت کنید یا به استفاده از برنامه SleepTracker که در نرمافزار قبلی ساختهاید ادامه دهید.
- کد RecyclerViewHeaders-Starter را از GitHub دانلود کنید. دایرکتوری RecyclerViewHeaders-Starter حاوی نسخه آغازین برنامه SleepTracker است که برای این کد لبه نیاز است. همچنین در صورت تمایل میتوانید با برنامه تمامشده خود از نسخه کد قبلی ادامه دهید.
- SleepNightAdapter.kt را باز کنید.
- در زیر کلاس
SleepNightListener
، در سطح بالا، یک کلاسsealed
و موم شده به نامDataItem
تعریف کنید که یک آیتم از داده را نشان می دهد.
یک کلاسsealed
یک نوع بسته را تعریف می کند، به این معنی که تمام زیر کلاس هایDataItem
باید در این فایل تعریف شوند. در نتیجه، تعداد زیر کلاس ها برای کامپایلر مشخص است. این امکان وجود ندارد که بخش دیگری از کد شما نوع جدیدی ازDataItem
را تعریف کند که ممکن است آداپتور شما را خراب کند.
sealed class DataItem {
}
- در داخل بدنه کلاس
DataItem
، دو کلاس تعریف کنید که نشان دهنده انواع مختلف اقلام داده است. اولین مورد یکSleepNightItem
است که دور یکSleepNight
بسته بندی می شود، بنابراین یک مقدار واحد به نامsleepNight
می گیرد. برای اینکه بخشی از کلاس مهر و موم شده باشد، از آنDataItem
را گسترش دهد.
data class SleepNightItem(val sleepNight: SleepNight): DataItem()
- کلاس دوم
Header
است که یک هدر را نشان می دهد. از آنجایی که هدر هیچ داده واقعی ندارد، می توانید آن را به عنوان یکobject
اعلام کنید. این بدان معناست که تنها یک نمونه ازHeader
وجود خواهد داشت. دوباره، از آنDataItem
را گسترش دهد.
object Header: DataItem()
- در داخل
DataItem
، در سطح کلاس، یک ویژگیLong
abstract
به نامid
تعریف کنید. هنگامی که آداپتور ازDiffUtil
برای تعیین اینکه آیا و چگونه یک آیتم تغییر کرده است استفاده می کند،DiffItemCallback
باید شناسه هر مورد را بداند. یک خطا خواهید دید، زیراSleepNightItem
وHeader
بایدid
ویژگی انتزاعی را لغو کنند.
abstract val id: Long
- در
SleepNightItem
،id
را لغو کنید تاnightId
را برگردانید.
override val id = sleepNight.nightId
- در
Header
،id
را لغو کنید تاLong.MIN_VALUE
را برگردانید، که یک عدد بسیار بسیار کوچک است (به معنای واقعی کلمه، -2 به توان 63). بنابراین، این هرگز با هیچnightId
موجود در تضاد نخواهد بود.
override val id = Long.MIN_VALUE
- کد تمام شده شما باید شبیه این باشد و برنامه شما باید بدون خطا ساخته شود.
sealed class DataItem {
abstract val id: Long
data class SleepNightItem(val sleepNight: SleepNight): DataItem() {
override val id = sleepNight.nightId
}
object Header: DataItem() {
override val id = Long.MIN_VALUE
}
}
مرحله 2: یک ViewHolder برای هدر ایجاد کنید
- طرح بندی هدر را در یک فایل منبع طرح بندی جدید به نام header.xml ایجاد کنید که
TextView
را نمایش می دهد. هیچ چیز هیجان انگیزی در این مورد وجود ندارد، بنابراین کد اینجاست.
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Sleep Results"
android:padding="8dp" />
-
"Sleep Results"
را در یک منبع رشته استخراج کنید و آن راheader_text
.
<string name="header_text">Sleep Results</string>
- در SleepNightAdapter.kt ، در داخل
SleepNightAdapter
، بالای کلاسViewHolder
، یک کلاسTextViewHolder
جدید ایجاد کنید. این کلاس طرح textview.xml را افزایش می دهد و یک نمونهTextViewHolder
را برمی گرداند. از آنجایی که قبلاً این کار را انجام داده اید، کد اینجاست و بایدView
وR
را وارد کنید:
class TextViewHolder(view: View): RecyclerView.ViewHolder(view) {
companion object {
fun from(parent: ViewGroup): TextViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val view = layoutInflater.inflate(R.layout.header, parent, false)
return TextViewHolder(view)
}
}
}
مرحله 3: SleepNightAdapter را به روز کنید
در مرحله بعد باید اعلان SleepNightAdapter
را به روز کنید. به جای اینکه فقط از یک نوع ViewHolder
کند، باید بتواند از هر نوع نگهدارنده view استفاده کند.
انواع اقلام را تعریف کنید
- در
SleepNightAdapter.kt
، در سطح بالا، زیر دستورهایimport
و بالایSleepNightAdapter
، دو ثابت برای انواع view تعریف کنید.
RecyclerView
باید نوع نمای هر آیتم را متمایز کند تا بتواند به درستی نگهدارنده دید را به آن اختصاص دهد.
private val ITEM_VIEW_TYPE_HEADER = 0
private val ITEM_VIEW_TYPE_ITEM = 1
- در داخل
SleepNightAdapter
، تابعی ایجاد کنید تاgetItemViewType()
را لغو کند تا هدر سمت راست یا آیتم را بسته به نوع آیتم فعلی ثابت کند.
override fun getItemViewType(position: Int): Int {
return when (getItem(position)) {
is DataItem.Header -> ITEM_VIEW_TYPE_HEADER
is DataItem.SleepNightItem -> ITEM_VIEW_TYPE_ITEM
}
}
تعریف SleepNightAdapter را به روز کنید
- در تعریف
SleepNightAdapter
، اولین آرگومانListAdapter
را ازSleepNight
بهDataItem
به روز کنید. - در تعریف
SleepNightAdapter
، دومین آرگومان عمومی برایListAdapter
را ازSleepNightAdapter.ViewHolder
بهRecyclerView.ViewHolder
تغییر دهید. برخی از خطاها را برای بهروزرسانیهای لازم مشاهده خواهید کرد و هدر کلاس شما باید مانند شکل زیر باشد.
class SleepNightAdapter(val clickListener: SleepNightListener):
ListAdapter<DataItem, RecyclerView.ViewHolder>(SleepNightDiffCallback()) {
به روز رسانی onCreateViewHolder()
- امضای
onCreateViewHolder()
را برای بازگرداندنRecyclerView.ViewHolder
تغییر دهید.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
- اجرای
onCreateViewHolder()
را برای آزمایش و برگرداندن دارنده view مناسب برای هر نوع آیتم گسترش دهید. روش به روز شده شما باید شبیه کد زیر باشد.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
ITEM_VIEW_TYPE_HEADER -> TextViewHolder.from(parent)
ITEM_VIEW_TYPE_ITEM -> ViewHolder.from(parent)
else -> throw ClassCastException("Unknown viewType ${viewType}")
}
}
به روز رسانی در BindViewHolder()
- نوع پارامتر
onBindViewHolder()
را ازViewHolder
بهRecyclerView.ViewHolder
تغییر دهید.
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
- شرطی را اضافه کنید تا فقط در صورتی که دارنده
ViewHolder
باشد، داده ها را به دارنده view اختصاص دهید.
when (holder) {
is ViewHolder -> {...}
- نوع شی که توسط
getItem()
برگردانده شده است را بهDataItem.SleepNightItem
ارسال کنید. تابعonBindViewHolder()
تمام شده شما باید شبیه این باشد.
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is ViewHolder -> {
val nightItem = getItem(position) as DataItem.SleepNightItem
holder.bind(nightItem.sleepNight, clickListener)
}
}
}
پاسخ تماس های diffUtil را به روز کنید
- روش های موجود در
SleepNightDiffCallback
را تغییر دهید تا از کلاسDataItem
جدید خود به جایSleepNight
استفاده کنید. همانطور که در کد زیر نشان داده شده است، اخطار پرز را خاموش کنید.
class SleepNightDiffCallback : DiffUtil.ItemCallback<DataItem>() {
override fun areItemsTheSame(oldItem: DataItem, newItem: DataItem): Boolean {
return oldItem.id == newItem.id
}
@SuppressLint("DiffUtilEquals")
override fun areContentsTheSame(oldItem: DataItem, newItem: DataItem): Boolean {
return oldItem == newItem
}
}
هدر را اضافه و ارسال کنید
- در داخل
SleepNightAdapter
، در زیرonCreateViewHolder()
یک تابعaddHeaderAndSubmitList()
را مطابق شکل زیر تعریف کنید. این تابع لیستی ازSleepNight
را می گیرد. به جای استفاده ازsubmitList()
ارائه شده توسطListAdapter
برای ارسال لیست خود، از این تابع برای اضافه کردن یک هدر و سپس ارسال لیست استفاده خواهید کرد.
fun addHeaderAndSubmitList(list: List<SleepNight>?) {}
- در داخل
addHeaderAndSubmitList()
، اگر لیست ارسال شدهnull
است، فقط یک هدر را برگردانید، در غیر این صورت، هدر را به سر لیست پیوست کنید و سپس لیست را ارسال کنید.
val items = when (list) {
null -> listOf(DataItem.Header)
else -> listOf(DataItem.Header) + list.map { DataItem.SleepNightItem(it) }
}
submitList(items)
- SleepTrackerFragment.kt را باز کنید و فراخوانی را به
submitList()
submitList بهaddHeaderAndSubmitList()
تغییر دهید.
- برنامه خود را اجرا کنید و مشاهده کنید که چگونه هدر شما به عنوان اولین مورد در لیست موارد خواب نمایش داده می شود.
دو مورد برای این برنامه وجود دارد که باید اصلاح شود. یکی قابل مشاهده است و یکی نیست.
- ضربه سر در گوشه بالا سمت چپ ظاهر می شود و به راحتی قابل تشخیص نیست.
- برای یک لیست کوتاه با یک هدر زیاد مهم نیست، اما نباید دستکاری لیست را در
addHeaderAndSubmitList()
در رشته UI انجام دهید. فهرستی با صدها آیتم، سربرگ های متعدد و منطق را تصور کنید تا تصمیم بگیرید که در کجا آیتم ها باید درج شوند. این اثر متعلق به یک کوروتین است.
برای استفاده از کوروتین ها، addHeaderAndSubmitList()
را تغییر دهید:
- در سطح بالای کلاس
SleepNightAdapter
، یکCoroutineScope
باDispatchers.Default
تعریف کنید.
private val adapterScope = CoroutineScope(Dispatchers.Default)
- در
addHeaderAndSubmitList()
یک coroutine درadapterScope
راه اندازی کنید تا لیست را دستکاری کنید. سپس به متنDispatchers.Main
تا لیست را ارسال کنید، همانطور که در کد زیر نشان داده شده است.
fun addHeaderAndSubmitList(list: List<SleepNight>?) {
adapterScope.launch {
val items = when (list) {
null -> listOf(DataItem.Header)
else -> listOf(DataItem.Header) + list.map { DataItem.SleepNightItem(it) }
}
withContext(Dispatchers.Main) {
submitList(items)
}
}
}
- کد شما باید ساخته و اجرا شود و هیچ تفاوتی نخواهید دید.
در حال حاضر، هدر به اندازه سایر موارد روی شبکه است و یک دهانه را به صورت افقی و عمودی اشغال می کند. کل شبکه سه مورد با عرض یک دهانه به صورت افقی متناسب است، بنابراین هدر باید از سه دهانه به صورت افقی استفاده کند.
برای اصلاح عرض هدر، باید به GridLayoutManager
بگویید که چه زمانی داده ها را در تمام ستون ها باز کند. می توانید این کار را با پیکربندی SpanSizeLookup
در GridLayoutManager
انجام دهید. این یک شی پیکربندی است که GridLayoutManager
برای تعیین تعداد دهانه برای هر آیتم در لیست استفاده می کند.
- SleepTrackerFragment.kt را باز کنید.
- در انتهای
onCreateView()
کدی را که در آنmanager
تعریف می کنید پیدا کنید.
val manager = GridLayoutManager(activity, 3)
- در زیر
manager
،manager.spanSizeLookup
را مطابق شکل تعریف کنید. شما باید یکobject
بسازید زیراsetSpanSizeLookup
لامبدا نمی گیرد. برای ایجاد یکobject
در Kotlin، تایپ کنیدobject : classname
، در این موردGridLayoutManager.SpanSizeLookup
.
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
}
- ممکن است یک خطای کامپایلر برای فراخوانی سازنده دریافت کنید. اگر این کار را انجام دادید، منوی قصد را با
Option+Enter
(Mac) یاAlt+Enter
(ویندوز) باز کنید تا فراخوانی سازنده اعمال شود.
- سپس یک خطایی روی
object
دریافت میکنید که میگوید باید روشها را لغو کنید. مکان نما را رویobject
قرار دهید،Option+Enter
(Mac) یاAlt+Enter
(ویندوز) را فشار دهید تا منوی intentions باز شود، سپس متدgetSpanSize()
را لغو کنید.
- در بدنه
getSpanSize()
اندازه دهانه مناسب را برای هر موقعیت برگردانید. موقعیت 0 دارای اندازه دهانه 3 است و موقعیت های دیگر دارای اندازه دهانه 1 هستند. کد تکمیل شده شما باید مانند کد زیر باشد:
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int) = when (position) {
0 -> 3
else -> 1
}
}
- برای بهبود ظاهر هدر خود، header.xml را باز کنید و این کد را به فایل طرح بندی header.xml اضافه کنید.
android:textColor="@color/white_text_color"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:background="@color/colorAccent"
- برنامه خود را اجرا کنید باید مانند تصویر زیر باشد.
تبریک می گویم! شما انجام دادید.
پروژه اندروید استودیو: RecyclerViewHeaders
- هدر عموماً آیتمی است که عرض یک لیست را در بر می گیرد و به عنوان عنوان یا جداکننده عمل می کند. یک لیست می تواند یک سربرگ واحد برای توصیف محتوای آیتم یا چندین سرصفحه برای گروه بندی آیتم ها و جداسازی آیتم ها از یکدیگر داشته باشد.
- یک
RecyclerView
میتواند از نگهدارندههای چندگانه برای قرار دادن مجموعهای ناهمگن از آیتمها استفاده کند. به عنوان مثال، سرصفحه ها و آیتم های لیست. - یکی از راههای افزودن هدر این است که آداپتور خود را برای استفاده از
ViewHolder
متفاوت با بررسی فهرستهایی که باید هدر شما نشان داده شود، تغییر دهید.Adapter
وظیفه پیگیری هدر را بر عهده دارد. - راه دیگر برای افزودن هدرها این است که مجموعه داده پشتیبان (فهرست) را برای شبکه داده خود تغییر دهید، این همان کاری است که در این کد لبه انجام دادید.
این مراحل اصلی برای افزودن هدر هستند:
- با ایجاد یک
DataItem
که می تواند سرصفحه یا داده ای را در خود جای دهد، داده های لیست خود را انتزاع کنید. - یک نگهدارنده view با یک طرح برای هدر در آداپتور ایجاد کنید.
- آداپتور و روش های آن را برای استفاده از هر نوع
RecyclerView.ViewHolder
به روز کنید. - در
onCreateViewHolder()
نوع صحیح نگهدارنده view را برای آیتم داده برگردانید. - برای کار با کلاس
DataItem
،SleepNightDiffCallback
را به روز کنید. - یک تابع
addHeaderAndSubmitList()
ایجاد کنید که از coroutines برای اضافه کردن سرصفحه به مجموعه داده استفاده می کند و سپسsubmitList()
را فراخوانی می کند. -
GridLayoutManager.SpanSizeLookup()
را پیاده سازی کنید تا فقط هدر سه دهانه داشته باشد.
دوره بی ادبی:
مستندات توسعه دهنده اندروید:
این بخش، تکالیف احتمالی را برای دانشآموزانی که در این آزمایشگاه کد به عنوان بخشی از دورهای که توسط یک مربی هدایت میشود، فهرست میکند. این وظیفه مربی است که موارد زیر را انجام دهد:
- در صورت نیاز تکالیف را تعیین کنید.
- نحوه ارسال تکالیف را با دانش آموزان در میان بگذارید.
- تکالیف را درجه بندی کنید.
مربیان میتوانند از این پیشنهادات به اندازهای که میخواهند استفاده کنند، و باید با خیال راحت هر تکلیف دیگری را که فکر میکنند مناسب است به آنها اختصاص دهند.
اگر به تنهایی بر روی این کدها کار می کنید، از این تکالیف برای آزمایش دانش خود استفاده کنید.
یه این سوالات پاسخ دهید
سوال 1
کدام یک از عبارات زیر در مورد ViewHolder
درست است؟
▢ یک آداپتور می تواند از چندین کلاس ViewHolder
برای نگهداری هدرها و انواع مختلف داده استفاده کند.
▢ میتوانید دقیقاً یک نگهدارنده نمایش برای دادهها و یک نگهدارنده نمایش برای سرصفحه داشته باشید.
▢ یک RecyclerView
از چندین نوع هدر پشتیبانی می کند، اما داده ها باید یکنواخت باشند.
▢ هنگام اضافه کردن هدر، RecyclerView
را زیر کلاس میدهید تا سرصفحه را در موقعیت صحیح قرار دهید.
سوال 2
چه زمانی باید از کوروتین ها با RecyclerView
استفاده کنید؟ تمام عبارات درست را انتخاب کنید.
▢ هرگز. RecyclerView
یک عنصر رابط کاربری است و نباید از کوروتین ها استفاده کند.
▢ برای کارهای طولانی مدت که می توانند رابط کاربری را کاهش دهند از برنامه های معمول استفاده کنید.
▢ دستکاری لیست می تواند زمان زیادی طول بکشد، و شما باید همیشه آنها را با استفاده از برنامه های روزانه انجام دهید.
▢ برای جلوگیری از مسدود شدن رشته اصلی، از کوروتین هایی با توابع تعلیق استفاده کنید.
سوال 3
هنگام استفاده از بیش از یک ViewHolder
، کدام یک از موارد زیر را نباید انجام دهید؟
▢ در ViewHolder
، چندین فایل طرح بندی را ارائه دهید تا در صورت نیاز باد شوند.
▢ در onCreateViewHolder()
نوع صحیح نگهدارنده view را برای آیتم داده برگردانید.
▢ در onBindViewHolder()
فقط در صورتی داده ها را پیوند می دهد که دارنده view نوع صحیح نگهدارنده view برای آیتم داده باشد.
▢ امضای کلاس آداپتور را برای پذیرش هر RecyclerView.ViewHolder
تعمیم دهید.
درس بعدی را شروع کنید:
برای پیوند به دیگر کدهای این دوره، به صفحه فرود کد لبههای کد پایه Android Kotlin Fundamentals مراجعه کنید.