Android Kotlin Fundamentals 07.5: Headers در RecyclerView

این کد لبه بخشی از دوره آموزشی 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 که در نرم‌افزار قبلی ساخته‌اید ادامه دهید.

  1. کد RecyclerViewHeaders-Starter را از GitHub دانلود کنید. دایرکتوری RecyclerViewHeaders-Starter حاوی نسخه آغازین برنامه SleepTracker است که برای این کد لبه نیاز است. همچنین در صورت تمایل می‌توانید با برنامه تمام‌شده خود از نسخه کد قبلی ادامه دهید.
  2. SleepNightAdapter.kt را باز کنید.
  3. در زیر کلاس SleepNightListener ، در سطح بالا، یک کلاس sealed و موم شده به نام DataItem تعریف کنید که یک آیتم از داده را نشان می دهد.

    یک کلاس sealed یک نوع بسته را تعریف می کند، به این معنی که تمام زیر کلاس های DataItem باید در این فایل تعریف شوند. در نتیجه، تعداد زیر کلاس ها برای کامپایلر مشخص است. این امکان وجود ندارد که بخش دیگری از کد شما نوع جدیدی از DataItem را تعریف کند که ممکن است آداپتور شما را خراب کند.
sealed class DataItem {

 }
  1. در داخل بدنه کلاس DataItem ، دو کلاس تعریف کنید که نشان دهنده انواع مختلف اقلام داده است. اولین مورد یک SleepNightItem است که دور یک SleepNight بسته بندی می شود، بنابراین یک مقدار واحد به نام sleepNight می گیرد. برای اینکه بخشی از کلاس مهر و موم شده باشد، از آن DataItem را گسترش دهد.
data class SleepNightItem(val sleepNight: SleepNight): DataItem()
  1. کلاس دوم Header است که یک هدر را نشان می دهد. از آنجایی که هدر هیچ داده واقعی ندارد، می توانید آن را به عنوان یک object اعلام کنید. این بدان معناست که تنها یک نمونه از Header وجود خواهد داشت. دوباره، از آن DataItem را گسترش دهد.
object Header: DataItem()
  1. در داخل DataItem ، در سطح کلاس، یک ویژگی Long abstract به نام id تعریف کنید. هنگامی که آداپتور از DiffUtil برای تعیین اینکه آیا و چگونه یک آیتم تغییر کرده است استفاده می کند، DiffItemCallback باید شناسه هر مورد را بداند. یک خطا خواهید دید، زیرا SleepNightItem و Header باید id ویژگی انتزاعی را لغو کنند.
abstract val id: Long
  1. در SleepNightItem ، id را لغو کنید تا nightId را برگردانید.
override val id = sleepNight.nightId
  1. در Header ، id را لغو کنید تا Long.MIN_VALUE را برگردانید، که یک عدد بسیار بسیار کوچک است (به معنای واقعی کلمه، -2 به توان 63). بنابراین، این هرگز با هیچ nightId موجود در تضاد نخواهد بود.
override val id = Long.MIN_VALUE
  1. کد تمام شده شما باید شبیه این باشد و برنامه شما باید بدون خطا ساخته شود.
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 برای هدر ایجاد کنید

  1. طرح بندی هدر را در یک فایل منبع طرح بندی جدید به نام 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" />
  1. "Sleep Results" را در یک منبع رشته استخراج کنید و آن را header_text .
<string name="header_text">Sleep Results</string>
  1. در 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 استفاده کند.

انواع اقلام را تعریف کنید

  1. در SleepNightAdapter.kt ، در سطح بالا، زیر دستورهای import و بالای SleepNightAdapter ، دو ثابت برای انواع view تعریف کنید.

    RecyclerView باید نوع نمای هر آیتم را متمایز کند تا بتواند به درستی نگهدارنده دید را به آن اختصاص دهد.
    private val ITEM_VIEW_TYPE_HEADER = 0
    private val ITEM_VIEW_TYPE_ITEM = 1
  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 را به روز کنید

  1. در تعریف SleepNightAdapter ، اولین آرگومان ListAdapter را از SleepNight به DataItem به روز کنید.
  2. در تعریف SleepNightAdapter ، دومین آرگومان عمومی برای ListAdapter را از SleepNightAdapter.ViewHolder به RecyclerView.ViewHolder تغییر دهید. برخی از خطاها را برای به‌روزرسانی‌های لازم مشاهده خواهید کرد و هدر کلاس شما باید مانند شکل زیر باشد.
class SleepNightAdapter(val clickListener: SleepNightListener):
       ListAdapter<DataItem, RecyclerView.ViewHolder>(SleepNightDiffCallback()) {

به روز رسانی onCreateViewHolder()

  1. امضای onCreateViewHolder() را برای بازگرداندن RecyclerView.ViewHolder تغییر دهید.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
  1. اجرای 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()

  1. نوع پارامتر onBindViewHolder() را از ViewHolder به RecyclerView.ViewHolder تغییر دهید.
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
  1. شرطی را اضافه کنید تا فقط در صورتی که دارنده ViewHolder باشد، داده ها را به دارنده view اختصاص دهید.
        when (holder) {
            is ViewHolder -> {...}
  1. نوع شی که توسط 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 را به روز کنید

  1. روش های موجود در 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
    }
}

هدر را اضافه و ارسال کنید

  1. در داخل SleepNightAdapter ، در زیر onCreateViewHolder() یک تابع addHeaderAndSubmitList() را مطابق شکل زیر تعریف کنید. این تابع لیستی از SleepNight را می گیرد. به جای استفاده از submitList() ارائه شده توسط ListAdapter برای ارسال لیست خود، از این تابع برای اضافه کردن یک هدر و سپس ارسال لیست استفاده خواهید کرد.
fun addHeaderAndSubmitList(list: List<SleepNight>?) {}
  1. در داخل addHeaderAndSubmitList() ، اگر لیست ارسال شده null است، فقط یک هدر را برگردانید، در غیر این صورت، هدر را به سر لیست پیوست کنید و سپس لیست را ارسال کنید.
val items = when (list) {
                null -> listOf(DataItem.Header)
                else -> listOf(DataItem.Header) + list.map { DataItem.SleepNightItem(it) }
            }
submitList(items)
  1. SleepTrackerFragment.kt را باز کنید و فراخوانی را به submitList() submitList به addHeaderAndSubmitList() تغییر دهید.
  1. برنامه خود را اجرا کنید و مشاهده کنید که چگونه هدر شما به عنوان اولین مورد در لیست موارد خواب نمایش داده می شود.

دو مورد برای این برنامه وجود دارد که باید اصلاح شود. یکی قابل مشاهده است و یکی نیست.

  • ضربه سر در گوشه بالا سمت چپ ظاهر می شود و به راحتی قابل تشخیص نیست.
  • برای یک لیست کوتاه با یک هدر زیاد مهم نیست، اما نباید دستکاری لیست را در addHeaderAndSubmitList() در رشته UI انجام دهید. فهرستی با صدها آیتم، سربرگ های متعدد و منطق را تصور کنید تا تصمیم بگیرید که در کجا آیتم ها باید درج شوند. این اثر متعلق به یک کوروتین است.

برای استفاده از کوروتین ها، addHeaderAndSubmitList() را تغییر دهید:

  1. در سطح بالای کلاس SleepNightAdapter ، یک CoroutineScope با Dispatchers.Default تعریف کنید.
private val adapterScope = CoroutineScope(Dispatchers.Default)
  1. در 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)
            }
        }
    }
  1. کد شما باید ساخته و اجرا شود و هیچ تفاوتی نخواهید دید.

در حال حاضر، هدر به اندازه سایر موارد روی شبکه است و یک دهانه را به صورت افقی و عمودی اشغال می کند. کل شبکه سه مورد با عرض یک دهانه به صورت افقی متناسب است، بنابراین هدر باید از سه دهانه به صورت افقی استفاده کند.

برای اصلاح عرض هدر، باید به GridLayoutManager بگویید که چه زمانی داده ها را در تمام ستون ها باز کند. می توانید این کار را با پیکربندی SpanSizeLookup در GridLayoutManager انجام دهید. این یک شی پیکربندی است که GridLayoutManager برای تعیین تعداد دهانه برای هر آیتم در لیست استفاده می کند.

  1. SleepTrackerFragment.kt را باز کنید.
  2. در انتهای onCreateView() کدی را که در آن manager تعریف می کنید پیدا کنید.
val manager = GridLayoutManager(activity, 3)
  1. در زیر manager ، manager.spanSizeLookup را مطابق شکل تعریف کنید. شما باید یک object بسازید زیرا setSpanSizeLookup لامبدا نمی گیرد. برای ایجاد یک object در Kotlin، تایپ کنید object : classname ، در این مورد GridLayoutManager.SpanSizeLookup .
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
}
  1. ممکن است یک خطای کامپایلر برای فراخوانی سازنده دریافت کنید. اگر این کار را انجام دادید، منوی قصد را با Option+Enter (Mac) یا Alt+Enter (ویندوز) باز کنید تا فراخوانی سازنده اعمال شود.
  1. سپس یک خطایی روی object دریافت می‌کنید که می‌گوید باید روش‌ها را لغو کنید. مکان نما را روی object قرار دهید، Option+Enter (Mac) یا Alt+Enter (ویندوز) را فشار دهید تا منوی intentions باز شود، سپس متد getSpanSize() را لغو کنید.
  1. در بدنه getSpanSize() اندازه دهانه مناسب را برای هر موقعیت برگردانید. موقعیت 0 دارای اندازه دهانه 3 است و موقعیت های دیگر دارای اندازه دهانه 1 هستند. کد تکمیل شده شما باید مانند کد زیر باشد:
    manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
            override fun getSpanSize(position: Int) =  when (position) {
                0 -> 3
                else -> 1
            }
        }
  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"
  1. برنامه خود را اجرا کنید باید مانند تصویر زیر باشد.

تبریک می گویم! شما انجام دادید.

پروژه اندروید استودیو: 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 تعمیم دهید.

درس بعدی را شروع کنید: 8.1 دریافت داده از اینترنت

برای پیوند به دیگر کدهای این دوره، به صفحه فرود کد لبه‌های کد پایه Android Kotlin Fundamentals مراجعه کنید.