Android Kotlin Fundamentals 07.4: تعامل با موارد RecyclerView

این کد لبه بخشی از دوره آموزشی Android Kotlin Fundamentals است. اگر به ترتیب روی کدها کار کنید، بیشترین ارزش را از این دوره خواهید گرفت. همه کد لبه های دوره در صفحه فرود کد لبه های Android Kotlin Fundamentals فهرست شده اند.

مقدمه

اکثر برنامه‌هایی که از فهرست‌ها و شبکه‌هایی استفاده می‌کنند که آیتم‌ها را نمایش می‌دهند، به کاربران اجازه می‌دهند با موارد تعامل داشته باشند. ضربه زدن به یک مورد از یک لیست و دیدن جزئیات آن مورد استفاده بسیار رایج برای این نوع تعامل است. برای رسیدن به این هدف، می‌توانید شنوندگان کلیکی را اضافه کنید که با نمایش نمای جزئیات، به ضربه‌های کاربر روی آیتم‌ها پاسخ می‌دهند.

در این کد لبه، شما تعامل را به RecyclerView خود اضافه می‌کنید که بر اساس نسخه توسعه‌یافته برنامه ردیاب خواب از سری قبلی کدها است.

آنچه از قبل باید بدانید

  • ساخت یک رابط کاربری پایه با استفاده از یک فعالیت، قطعات و نماها.
  • پیمایش بین قطعات و استفاده از safeArgs برای انتقال داده ها بین قطعات.
  • مشاهده مدل‌ها، مشاهده کارخانه‌های مدل، تبدیل‌ها، و LiveData و ناظران آن‌ها.
  • نحوه ایجاد پایگاه داده Room ، ایجاد یک شی دسترسی به داده (DAO) و تعریف موجودیت ها.
  • نحوه استفاده از کوروتین ها برای پایگاه داده و سایر کارهای طولانی مدت.
  • نحوه پیاده سازی RecyclerView اولیه با Adapter ، ViewHolder و طرح بندی آیتم.
  • نحوه اجرای اتصال داده برای RecyclerView .
  • نحوه ایجاد و استفاده از آداپتورهای اتصال برای تبدیل داده ها.
  • نحوه استفاده از GridLayoutManager

چیزی که یاد خواهید گرفت

  • چگونه موارد موجود در RecyclerView را قابل کلیک کنیم. وقتی روی موردی کلیک می‌شود، شنونده کلیکی را برای رفتن به نمای جزئیات اجرا کنید.

کاری که خواهی کرد

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

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

اولین صفحه نمایش داده شده در سمت چپ دارای دکمه هایی برای شروع و توقف ردیابی است. صفحه نمایش برخی از داده های خواب کاربر را نشان می دهد. دکمه Clear تمام داده هایی را که برنامه برای کاربر جمع آوری کرده است برای همیشه حذف می کند. صفحه دوم، نشان داده شده در سمت راست، برای انتخاب رتبه بندی کیفیت خواب است.

این برنامه از معماری ساده شده با کنترلر رابط کاربری، مدل نمایش و LiveData و پایگاه داده Room برای تداوم داده های خواب استفاده می کند.

در این کد لبه، شما توانایی پاسخ دادن به زمانی که کاربر روی موردی در شبکه ضربه می‌زند را اضافه می‌کنید، که صفحه جزئیات مانند تصویر زیر ظاهر می‌شود. کد این صفحه (قطعه، مدل مشاهده و پیمایش) همراه با برنامه شروع ارائه شده است و شما مکانیسم کنترل کلیک را پیاده سازی خواهید کرد.

مرحله 1: برنامه شروع را دریافت کنید

  1. کد RecyclerViewClickHandler-Starter را از GitHub دانلود کنید و پروژه را در Android Studio باز کنید.
  2. برنامه ردیاب خواب استارتر را بسازید و اجرا کنید.

[اختیاری] اگر می‌خواهید از برنامه نسخه کد قبلی استفاده کنید، برنامه خود را به‌روزرسانی کنید

اگر می خواهید از برنامه شروع ارائه شده در GitHub برای این کد لبه کار کنید، به مرحله بعدی بروید.

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

  1. حتی اگر به برنامه موجود خود ادامه می دهید، کد RecyclerViewClickHandler-Starter را از GitHub دریافت کنید تا بتوانید فایل ها را کپی کنید.
  2. تمام فایل های موجود در بسته sleepdetail کپی کنید.
  3. در پوشه layout ، فایل fragment_sleep_detail.xml را کپی کنید.
  4. محتویات به روز شده navigation.xml را کپی کنید، که پیمایش را برای sleep_detail_fragment اضافه می کند.
  5. در بسته database ، در SleepDatabaseDao ، متد getNightWithId() جدید را اضافه کنید:
/**
 * Selects and returns the night with given nightId.
*/
@Query("SELECT * from daily_sleep_quality_table WHERE nightId = :key")
fun getNightWithId(key: Long): LiveData<SleepNight>
  1. در res/values/strings منبع رشته زیر را اضافه کنید:
<string name="close">Close</string>
  1. برای به‌روزرسانی پیوند داده، برنامه خود را تمیز و بازسازی کنید.

مرحله 2: کد صفحه جزئیات خواب را بررسی کنید

در این کد لبه، شما یک کنترل کننده کلیک را پیاده سازی می کنید که به قطعه ای هدایت می شود که جزئیات مربوط به شب خواب کلیک شده را نشان می دهد. کد شروع شما قبلاً شامل قطعه و نمودار پیمایش برای این SleepDetailFragment است، زیرا مقدار کمی کد است و قطعات و پیمایش بخشی از این کد لبه نیستند. با کد زیر آشنا شوید:

  1. در برنامه خود، بسته sleepdetail را پیدا کنید. این بسته شامل قطعه، مدل نمایش و کارخانه نمایش مدل برای قطعه ای است که جزئیات یک شب خواب را نمایش می دهد.

  2. در بسته sleepdetail ، کد SleepDetailViewModel را باز کرده و بررسی کنید. این مدل view کلید یک SleepNight و یک DAO را در سازنده می گیرد.

    بدنه کلاس دارای کدی برای دریافت SleepNight برای کلید داده شده، و متغیر navigateToSleepTracker برای کنترل مسیریابی به SleepTrackerFragment با فشار دادن دکمه Close است.

    تابع getNightWithId() یک LiveData<SleepNight> برمی گرداند و در SleepDatabaseDao (در بسته database ) تعریف شده است.

  3. در بسته sleepdetail ، کد SleepDetailFragment را باز کرده و بررسی کنید. به تنظیمات مربوط به اتصال داده ها، مدل نمایش و مشاهده گر برای ناوبری توجه کنید.

  4. در بسته sleepdetail ، کد SleepDetailViewModelFactory را باز کرده و بررسی کنید.

  5. در پوشه layout، fragment_sleep_detail.xml بررسی کنید. به متغیر sleepDetailViewModel که در تگ <data> تعریف شده است توجه کنید تا داده ها را در هر نما از مدل view نمایش دهید.

    این طرح شامل یک ConstraintLayout است که شامل ImageView برای کیفیت خواب، TextView برای رتبه بندی کیفیت، TextView برای طول خواب، و Button برای بستن قطعه جزئیات است.

  6. فایل navigation.xml را باز کنید. برای sleep_tracker_fragment ، به عملکرد جدید sleep_detail_fragment توجه کنید.

    اقدام جدید، action_sleep_tracker_fragment_to_sleepDetailFragment ، پیمایش از قطعه ردیاب خواب به صفحه جزئیات است.

در این کار، RecyclerView به‌روزرسانی می‌کنید تا با نمایش صفحه جزئیات مورد ضربه‌خورده، به ضربه‌های کاربر پاسخ دهد.

دریافت کلیک ها و مدیریت آنها یک کار دو قسمتی است: ابتدا باید به کلیک ها گوش داده و دریافت کنید و مشخص کنید که روی کدام مورد کلیک شده است. سپس، باید با یک عمل به کلیک پاسخ دهید.

بنابراین، بهترین مکان برای افزودن یک کلیک شنونده برای این برنامه چیست؟

  • SleepTrackerFragment میزبان بازدیدهای زیادی است، بنابراین گوش دادن به رویدادهای کلیک در سطح قطعه به شما نمی گوید که روی کدام مورد کلیک شده است. حتی به شما نمی گوید که آیا این مورد روی آن کلیک شده است یا یکی از عناصر رابط کاربری دیگر.
  • با گوش دادن در سطح RecyclerView ، تشخیص اینکه کاربر دقیقاً روی چه موردی در لیست کلیک کرده است دشوار است.
  • بهترین سرعت برای دریافت اطلاعات در مورد یک مورد کلیک شده در شی ViewHolder است، زیرا نشان دهنده یک آیتم لیست است.

در حالی که ViewHolder مکانی عالی برای گوش دادن به کلیک‌ها است، اما معمولاً مکان مناسبی برای رسیدگی به آنها نیست. بنابراین، بهترین مکان برای مدیریت کلیک ها چیست؟

  • Adapter موارد داده را در نماها نمایش می دهد، بنابراین می توانید کلیک ها را در آداپتور کنترل کنید. با این حال، وظیفه آداپتور تطبیق داده ها برای نمایش است، نه مقابله با منطق برنامه.
  • معمولاً باید کلیک‌ها را در ViewModel مدیریت کنید، زیرا ViewModel به داده‌ها و منطق برای تعیین اینکه در پاسخ به کلیک چه اتفاقی باید بیفتد دسترسی دارد.

مرحله 1: یک شنونده کلیک ایجاد کنید و آن را از طرح بندی آیتم فعال کنید

  1. در پوشه sleeptracker ، SleepNightAdapter.kt را باز کنید.
  2. در انتهای فایل، در سطح بالا، یک کلاس شنونده جدید، SleepNightListener ایجاد کنید.
class SleepNightListener() {
    
}
  1. در کلاس SleepNightListener ، یک تابع onClick() اضافه کنید. هنگامی که روی نمایی که یک آیتم لیست را نمایش می دهد کلیک می شود، view این تابع onClick() را فراخوانی می کند. (شما ویژگی android:onClick view را بعداً روی این تابع تنظیم خواهید کرد.)
class SleepNightListener() {
    fun onClick() = 
}
  1. یک تابع آرگومان night از نوع SleepNight به onClick() اضافه کنید. نما می داند که چه موردی را نمایش می دهد، و این اطلاعات باید برای مدیریت کلیک منتقل شود.
class SleepNightListener() {
    fun onClick(night: SleepNight) = 
}
  1. برای تعریف کاری که onClick() انجام می دهد، در سازنده SleepNightListener یک پاسخ تماس clickListener کنید و آن را به onClick() اختصاص دهید.

    نام گذاری به لامبدا که کلیک را کنترل می کند، clickListener ، به پیگیری آن در حین ارسال بین کلاس ها کمک می کند. پاسخ به تماس clickListener فقط به night.nightId برای دسترسی به داده ها از پایگاه داده نیاز دارد. کلاس SleepNightListener تمام شده شما باید شبیه کد زیر باشد.
class SleepNightListener(val clickListener: (sleepId: Long) -> Unit) {
   fun onClick(night: SleepNight) = clickListener(night.nightId)
}
  1. list_item_sleep_night.xml را باز کنید.
  2. در داخل بلوک data ، یک متغیر جدید اضافه کنید تا کلاس SleepNightListener از طریق اتصال داده در دسترس باشد. به <variable> جدید یک name clickListener. مطابق شکل زیر، type را روی نام کاملاً واجد شرایط کلاس com.example.android.trackmysleepquality.sleeptracker.SleepNightListener تنظیم کنید. اکنون می توانید از این طرح به تابع onClick() در SleepNightListener دسترسی داشته باشید.
<variable
            name="clickListener"
            type="com.example.android.trackmysleepquality.sleeptracker.SleepNightListener" />
  1. برای گوش دادن به کلیک‌ها روی هر بخشی از این فهرست، ویژگی android:onClick به ConstraintLayout اضافه کنید.

    همانطور که در زیر نشان داده شده است، مشخصه را روی clickListener:onClick(sleep) با استفاده از یک data binding lambda تنظیم کنید:
android:onClick="@{() -> clickListener.onClick(sleep)}"

مرحله 2: شنونده کلیک را به نگهدارنده view و شی binding ارسال کنید

  1. SleepNightAdapter.kt را باز کنید.
  2. سازنده کلاس SleepNightAdapter را برای دریافت val clickListener: SleepNightListener . هنگامی که آداپتور ViewHolder متصل می کند، باید آن را با این کلیک شنونده ارائه دهد.
class SleepNightAdapter(val clickListener: SleepNightListener):
       ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {
  1. در onBindViewHolder() تماس را به holder.bind() به روز کنید تا شنونده کلیک را نیز به ViewHolder ارسال کنید. شما یک خطای کامپایلر دریافت خواهید کرد زیرا پارامتری را به فراخوانی تابع اضافه کرده اید.
holder.bind(getItem(position)!!, clickListener)
  1. پارامتر clickListener را به bind() اضافه کنید. برای انجام این کار، مکان نما را روی خطا قرار دهید و Alt+Enter (ویندوز) یا Option+Enter (Mac) را بر روی ارور به را فشار دهید، همانطور که در تصویر زیر نشان داده شده است.

  1. در داخل کلاس ViewHolder ، در داخل تابع bind() شنونده کلیک را به شی binding اختصاص دهید. شما یک خطا می بینید زیرا باید شی binding را به روز کنید.
binding.clickListener = clickListener
  1. برای به روز رسانی اتصال داده ها، پروژه خود را تمیز و بازسازی کنید . (شاید لازم باشد حافظه پنهان را نیز باطل کنید.) بنابراین، شما یک کلیک شنونده را از سازنده آداپتور گرفته اید و آن را تا انتها به نگهدارنده view و به شیء binding منتقل کرده اید.

مرحله 3: هنگامی که روی یک مورد ضربه زده می شود، نان تست را نمایش دهید

شما اکنون کدی را برای ثبت کلیک در اختیار دارید، اما آنچه را که هنگام ضربه زدن روی یک آیتم لیست اتفاق می‌افتد را اجرا نکرده‌اید. ساده ترین پاسخ نمایش یک نان تست است که با کلیک روی یک آیتم، nightId نشان می دهد. این تأیید می کند که وقتی روی یک آیتم لیست کلیک می شود، nightId صحیح گرفته می شود و ارسال می شود.

  1. SleepTrackerFragment.kt را باز کنید.
  2. در onCreateView() متغیر adapter پیدا کنید. توجه داشته باشید که یک خطا نشان می دهد، زیرا اکنون انتظار یک پارامتر شنونده کلیک را دارد.
  3. با ارسال لامبدا به SleepNightAdapter ، شنونده کلیکی را تعریف کنید. این لامبدا ساده فقط یک نان تست را نشان می دهد که nightId نشان می دهد، همانطور که در زیر نشان داده شده است. باید Toast وارد کنید. در زیر تعریف کامل به روز شده است.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
   Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})
  1. برنامه را اجرا کنید، روی موارد ضربه بزنید و بررسی کنید که نان تست با nightId درست نمایش داده شوند. از آنجایی که آیتم ها دارای مقادیر nightId در حال افزایش هستند و برنامه اولین شب اخیر را نمایش می دهد، موردی با کمترین nightId در انتهای لیست قرار دارد.

در این کار، وقتی روی موردی در RecyclerView کلیک می‌شود، رفتار را تغییر می‌دهید، به‌طوری‌که به جای نمایش یک نان تست، برنامه به قسمتی از جزئیات هدایت می‌شود که اطلاعات بیشتری درباره شب کلیک‌شده نشان می‌دهد.

مرحله 1: روی کلیک حرکت کنید

در این مرحله، به جای نمایش یک نان تست، شنونده کلیک لامبدا را در onCreateView() SleepTrackerFragment تغییر می‌دهید تا nightId را به SleepTrackerViewModel منتقل کنید و پیمایش را به SleepDetailFragment راه‌اندازی کنید.

تابع کنترل کلیک را تعریف کنید:

  1. SleepTrackerViewModel.kt را باز کنید.
  2. در داخل SleepTrackerViewModel ، در انتها، تابع کنترل کننده کلیک onSleepNightClicked() را تعریف کنید.
fun onSleepNightClicked(id: Long) {

}
  1. در داخل onSleepNightClicked() ، با تنظیم _navigateToSleepDetail روی id ارسال شده شب خواب کلیک شده، ناوبری را فعال کنید.
fun onSleepNightClicked(id: Long) {
   _navigateToSleepDetail.value = id
}
  1. پیاده سازی _navigateToSleepDetail . همانطور که قبلا انجام داده اید، یک private MutableLiveData برای وضعیت ناوبری تعریف کنید. و یک val عمومی برای همراهی با آن.
private val _navigateToSleepDetail = MutableLiveData<Long>()
val navigateToSleepDetail
   get() = _navigateToSleepDetail
  1. روشی را برای تماس پس از پایان ناوبری برنامه تعیین کنید. آن را onSleepDetailNavigated() صدا بزنید و مقدار آن را null قرار دهید.
fun onSleepDetailNavigated() {
    _navigateToSleepDetail.value = null
}

کد را برای تماس با کنترل کننده کلیک اضافه کنید:

  1. SleepTrackerFragment.kt را باز کنید و به کدی بروید که آداپتور را ایجاد می کند و SleepNightListener برای نمایش یک نان تست تعریف می کند.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
   Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})
  1. کد زیر را در زیر نان تست برای فراخوانی یک کنترل کننده کلیک، onSleepNighClicked() در sleepTrackerViewModel هنگام ضربه زدن روی یک مورد اضافه کنید. از nightId عبور کنید، تا مدل view بداند کدام شب را باید بخوابد. این شما را با یک خطا مواجه می‌کند، زیرا هنوز onSleepNightClicked() تعریف نکرده‌اید. شما می توانید به دلخواه نان تست را نگه دارید، نظر بدهید یا آن را حذف کنید.
sleepTrackerViewModel.onSleepNightClicked(nightId)

کد را برای مشاهده کلیک ها اضافه کنید:

  1. SleepTrackerFragment.kt را باز کنید.
  2. در onCreateView() درست بالای اعلان manager ، کدی را برای مشاهده navigateToSleepDetail LiveData جدید اضافه کنید. هنگامی که navigateToSleepDetail تغییر می کند، به SleepDetailFragment بروید، که در night می گذرد، سپس onSleepDetailNavigated() را فراخوانی کنید. از آنجایی که قبلاً این کار را در یک کد قبلی انجام داده اید، کد زیر است:
sleepTrackerViewModel.navigateToSleepDetail.observe(this, Observer { night ->
            night?.let {
              this.findNavController().navigate(
                        SleepTrackerFragmentDirections
                                .actionSleepTrackerFragmentToSleepDetailFragment(night))
               sleepTrackerViewModel.onSleepDetailNavigated()
            }
        })
  1. کد خود را اجرا کنید، روی یک مورد کلیک کنید و ... برنامه از کار می افتد.

مدیریت مقادیر تهی در آداپتورهای اتصال:

  1. برنامه را دوباره در حالت دیباگ اجرا کنید. روی یک مورد ضربه بزنید و گزارش‌ها را برای نمایش خطاها فیلتر کنید. این یک ردیابی پشته شامل چیزی شبیه آنچه در زیر است را نشان می دهد.
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter item

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

با این حال، به نظر می رسد که با این مکانیسم جدید مدیریت کلیک، اکنون این امکان وجود دارد که آداپتورهای اتصال با یک مقدار null برای item فراخوانی شوند. به طور خاص، زمانی که برنامه شروع می شود، LiveData به صورت null شروع می شود، بنابراین باید چک های تهی را به هر یک از آداپتورها اضافه کنید.

  1. در BindingUtils.kt ، برای هر یک از آداپتورهای binding، نوع آرگومان item را به nullable تغییر دهید و بدنه را با item?.let{...} بپیچید. به عنوان مثال، آداپتور شما برای sleepQualityString به این شکل خواهد بود. آداپتورهای دیگر را نیز به همین ترتیب تغییر دهید.
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight?) {
   item?.let {
       text = convertNumericQualityToString(item.sleepQuality, context.resources)
   }
}
  1. برنامه خود را اجرا کنید روی یک مورد ضربه بزنید و نمای جزئیات باز می شود.

پروژه Android Studio: RecyclerViewClickHandler .

برای اینکه موارد موجود در RecyclerView به کلیک‌ها پاسخ دهند، شنونده‌های کلیک را به موارد فهرست در ViewHolder متصل کنید و کلیک‌ها را در ViewModel مدیریت کنید.

برای اینکه موارد موجود در RecyclerView به کلیک‌ها پاسخ دهند، باید موارد زیر را انجام دهید:

  • یک کلاس شنونده ایجاد کنید که یک لامبدا بگیرد و آن را به یک تابع onClick() اختصاص دهد.
class SleepNightListener(val clickListener: (sleepId: Long) -> Unit) {
   fun onClick(night: SleepNight) = clickListener(night.nightId)
}
  • شنونده کلیک را روی نما تنظیم کنید.
android:onClick="@{() -> clickListener.onClick(sleep)}"
  • شنونده کلیک را به سازنده آداپتور، به نگهدارنده view منتقل کنید و آن را به شی binding اضافه کنید.
class SleepNightAdapter(val clickListener: SleepNightListener):
       ListAdapter<DataItem, RecyclerView.ViewHolder>(SleepNightDiffCallback()
holder.bind(getItem(position)!!, clickListener)
binding.clickListener = clickListener
  • در قسمتی که نمای Recycler را نشان می دهد، جایی که آداپتور را ایجاد می کنید، با ارسال یک لامبدا به آداپتور، یک کلیک شنونده تعریف کنید.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
      sleepTrackerViewModel.onSleepNightClicked(nightId)
})
  • کنترل کننده کلیک را در مدل view پیاده سازی کنید. برای کلیک روی آیتم‌های فهرست، این معمولاً باعث پیمایش به یک قطعه جزئیات می‌شود.

دوره بی ادبی:

مستندات توسعه دهنده اندروید:

این بخش، تکالیف احتمالی را برای دانش‌آموزانی که در این آزمایشگاه کد به عنوان بخشی از دوره‌ای که توسط یک مربی هدایت می‌شود، کار می‌کنند، فهرست می‌کند. این وظیفه مربی است که موارد زیر را انجام دهد:

  • در صورت نیاز تکالیف را تعیین کنید.
  • نحوه ارسال تکالیف را با دانش آموزان در میان بگذارید.
  • تکالیف را نمره دهید.

مربیان می‌توانند از این پیشنهادات به اندازه‌ای که می‌خواهند استفاده کنند، و باید با خیال راحت هر تکلیف دیگری را که فکر می‌کنند مناسب است، محول کنند.

اگر به تنهایی از طریق این کدها کار می کنید، از این تکالیف برای آزمایش دانش خود استفاده کنید.

به این سوالات پاسخ دهید

سوال 1

فرض کنید برنامه شما حاوی RecyclerView است که موارد را در لیست خرید نمایش می دهد. برنامه شما همچنین یک کلاس کلیک-شنونده را تعریف می کند:

class ShoppingListItemListener(val clickListener: (itemId: Long) -> Unit) {
    fun onClick(cartItem: CartItem) = clickListener(cartItem.itemId)
}

چگونه ShoppingListItemListener در دسترس داده ها به صورت الزام آور می کنید؟ یکی را انتخاب کنید.

▢ در فایل طرح‌بندی که حاوی RecyclerView است که لیست خرید را نمایش می‌دهد، یک متغیر <data> برای ShoppingListItemListener اضافه کنید.

▢ در فایل طرح‌بندی که طرح‌بندی را برای یک ردیف در فهرست خرید تعریف می‌کند، یک متغیر <data> برای ShoppingListItemListener اضافه کنید.

▢ در کلاس ShoppingListItemListener ، یک تابع برای فعال کردن اتصال داده اضافه کنید:

fun onBinding (cartItem: CartItem) {dataBindingEnable(true)}

▢ در کلاس ShoppingListItemListener ، در داخل تابع onClick() یک فراخوانی برای فعال کردن اتصال داده اضافه کنید:

fun onClick(cartItem: CartItem) = { 
    clickListener(cartItem.itemId)
    dataBindingEnable(true)
}

سوال 2

کجا می‌توانید ویژگی android:onClick را اضافه کنید تا موارد موجود در RecyclerView به کلیک‌ها پاسخ دهند؟ همه موارد کاربردی را انتخاب کنید.

▢ در فایل طرح‌بندی که RecyclerView نمایش می‌دهد، آن را به <androidx.recyclerview.widget.RecyclerView> اضافه کنید.

▢ آن را به فایل طرح بندی یک مورد در ردیف اضافه کنید. اگر می‌خواهید کل آیتم قابل کلیک باشد، آن را به نمای والد که شامل موارد در ردیف است اضافه کنید.

▢ آن را به فایل طرح بندی یک مورد در ردیف اضافه کنید. اگر می‌خواهید یک TextView در مورد قابل کلیک باشد، آن را به <TextView> اضافه کنید.

▢ همیشه آن را فایل طرح بندی برای MainActivity اضافه کنید.

درس بعدی را شروع کنید: 7.5: هدرها در RecyclerView