این کد لبه بخشی از دوره آموزشی Android Kotlin Fundamentals است. اگر به ترتیب روی کدها کار کنید، بیشترین ارزش را از این دوره خواهید گرفت. همه کد لبه های دوره در صفحه فرود کد لبه های Android Kotlin Fundamentals فهرست شده اند.
مقدمه
اکثر برنامههایی که از فهرستها و شبکههایی استفاده میکنند که آیتمها را نمایش میدهند، به کاربران اجازه میدهند با موارد تعامل داشته باشند. ضربه زدن به یک مورد از یک لیست و دیدن جزئیات آن مورد استفاده بسیار رایج برای این نوع تعامل است. برای رسیدن به این هدف، میتوانید شنوندگان کلیکی را اضافه کنید که با نمایش نمای جزئیات، به ضربههای کاربر روی آیتمها پاسخ میدهند.
در این کد لبه، شما تعامل را به RecyclerView خود اضافه میکنید که بر اساس نسخه توسعهیافته برنامه ردیاب خواب از سری قبلی کدها است.
آنچه از قبل باید بدانید
- ساخت یک رابط کاربری پایه با استفاده از یک فعالیت، قطعات و نماها.
- پیمایش بین قطعات و استفاده از
safeArgsبرای انتقال داده ها بین قطعات. - مشاهده مدلها، مشاهده کارخانههای مدل، تبدیلها، و
LiveDataو ناظران آنها. - نحوه ایجاد پایگاه داده
Room، ایجاد یک شی دسترسی به داده (DAO) و تعریف موجودیت ها. - نحوه استفاده از کوروتین ها برای پایگاه داده و سایر کارهای طولانی مدت.
- نحوه پیاده سازی
RecyclerViewاولیه باAdapter،ViewHolderو طرح بندی آیتم. - نحوه اجرای اتصال داده برای
RecyclerView. - نحوه ایجاد و استفاده از آداپتورهای اتصال برای تبدیل داده ها.
- نحوه استفاده از
GridLayoutManager
چیزی که یاد خواهید گرفت
- چگونه موارد موجود در
RecyclerViewرا قابل کلیک کنیم. وقتی روی موردی کلیک میشود، شنونده کلیکی را برای رفتن به نمای جزئیات اجرا کنید.
کاری که خواهی کرد
- بر روی نسخه توسعه یافته برنامه TrackMySleepQuality از کدهای قبلی در این سری ساخته شده است.
- یک شنونده کلیکی را به لیست خود اضافه کنید و برای تعامل با کاربر شروع به گوش دادن کنید. هنگامی که روی یک مورد فهرست ضربه میزنید، پیمایش به یک قطعه با جزئیات روی مورد کلیک شده آغاز میشود. کد شروع کد برای قطعه جزئیات و همچنین کد ناوبری ارائه می کند.
برنامه شروع خواب ردیاب دارای دو صفحه است که با قطعات نشان داده شده است، همانطور که در شکل زیر نشان داده شده است.
|
|
اولین صفحه نمایش داده شده در سمت چپ دارای دکمه هایی برای شروع و توقف ردیابی است. صفحه نمایش برخی از داده های خواب کاربر را نشان می دهد. دکمه Clear تمام داده هایی را که برنامه برای کاربر جمع آوری کرده است برای همیشه حذف می کند. صفحه دوم، نشان داده شده در سمت راست، برای انتخاب رتبه بندی کیفیت خواب است.
این برنامه از معماری ساده شده با کنترلر رابط کاربری، مدل نمایش و LiveData و پایگاه داده Room برای تداوم داده های خواب استفاده می کند.

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

مرحله 1: برنامه شروع را دریافت کنید
- کد RecyclerViewClickHandler-Starter را از GitHub دانلود کنید و پروژه را در Android Studio باز کنید.
- برنامه ردیاب خواب استارتر را بسازید و اجرا کنید.
[اختیاری] اگر میخواهید از برنامه نسخه کد قبلی استفاده کنید، برنامه خود را بهروزرسانی کنید
اگر می خواهید از برنامه شروع ارائه شده در GitHub برای این کد لبه کار کنید، به مرحله بعدی بروید.
اگر میخواهید به استفاده از برنامه ردیاب خواب خود که در نسخه کد قبلی ساختهاید ادامه دهید، دستورالعملهای زیر را دنبال کنید تا برنامه موجود خود را بهروزرسانی کنید تا کد قطعه جزئیات صفحه نمایش را داشته باشد.
- حتی اگر به برنامه موجود خود ادامه می دهید، کد RecyclerViewClickHandler-Starter را از GitHub دریافت کنید تا بتوانید فایل ها را کپی کنید.
- تمام فایل های موجود در بسته
sleepdetailکپی کنید. - در پوشه
layout، فایلfragment_sleep_detail.xmlرا کپی کنید. - محتویات به روز شده
navigation.xmlرا کپی کنید، که پیمایش را برایsleep_detail_fragmentاضافه می کند. - در بسته
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>- در
res/values/stringsمنبع رشته زیر را اضافه کنید:
<string name="close">Close</string>- برای بهروزرسانی پیوند داده، برنامه خود را تمیز و بازسازی کنید.
مرحله 2: کد صفحه جزئیات خواب را بررسی کنید
در این کد لبه، شما یک کنترل کننده کلیک را پیاده سازی می کنید که به قطعه ای هدایت می شود که جزئیات مربوط به شب خواب کلیک شده را نشان می دهد. کد شروع شما قبلاً شامل قطعه و نمودار پیمایش برای این SleepDetailFragment است، زیرا مقدار کمی کد است و قطعات و پیمایش بخشی از این کد لبه نیستند. با کد زیر آشنا شوید:
- در برنامه خود، بسته
sleepdetailرا پیدا کنید. این بسته شامل قطعه، مدل نمایش و کارخانه نمایش مدل برای قطعه ای است که جزئیات یک شب خواب را نمایش می دهد. - در بسته
sleepdetail، کدSleepDetailViewModelرا باز کرده و بررسی کنید. این مدل view کلید یکSleepNightو یک DAO را در سازنده می گیرد.
بدنه کلاس دارای کدی برای دریافتSleepNightبرای کلید داده شده، و متغیرnavigateToSleepTrackerبرای کنترل مسیریابی بهSleepTrackerFragmentبا فشار دادن دکمه Close است.
تابعgetNightWithId()یکLiveData<SleepNight>برمی گرداند و درSleepDatabaseDao(در بستهdatabase) تعریف شده است. - در بسته
sleepdetail، کدSleepDetailFragmentرا باز کرده و بررسی کنید. به تنظیمات مربوط به اتصال داده ها، مدل نمایش و مشاهده گر برای ناوبری توجه کنید. - در بسته
sleepdetail، کدSleepDetailViewModelFactoryرا باز کرده و بررسی کنید. - در پوشه layout،
fragment_sleep_detail.xmlبررسی کنید. به متغیرsleepDetailViewModelکه در تگ<data>تعریف شده است توجه کنید تا داده ها را در هر نما از مدل view نمایش دهید.
این طرح شامل یکConstraintLayoutاست که شاملImageViewبرای کیفیت خواب،TextViewبرای رتبه بندی کیفیت،TextViewبرای طول خواب، وButtonبرای بستن قطعه جزئیات است. - فایل
navigation.xmlرا باز کنید. برایsleep_tracker_fragment، به عملکرد جدیدsleep_detail_fragmentتوجه کنید.
اقدام جدید،action_sleep_tracker_fragment_to_sleepDetailFragment، پیمایش از قطعه ردیاب خواب به صفحه جزئیات است.
در این کار، RecyclerView بهروزرسانی میکنید تا با نمایش صفحه جزئیات مورد ضربهخورده، به ضربههای کاربر پاسخ دهد.
دریافت کلیک ها و مدیریت آنها یک کار دو قسمتی است: ابتدا باید به کلیک ها گوش داده و دریافت کنید و مشخص کنید که روی کدام مورد کلیک شده است. سپس، باید با یک عمل به کلیک پاسخ دهید.
بنابراین، بهترین مکان برای افزودن یک کلیک شنونده برای این برنامه چیست؟
-
SleepTrackerFragmentمیزبان بازدیدهای زیادی است، بنابراین گوش دادن به رویدادهای کلیک در سطح قطعه به شما نمی گوید که روی کدام مورد کلیک شده است. حتی به شما نمی گوید که آیا این مورد روی آن کلیک شده است یا یکی از عناصر رابط کاربری دیگر. - با گوش دادن در سطح
RecyclerView، تشخیص اینکه کاربر دقیقاً روی چه موردی در لیست کلیک کرده است دشوار است. - بهترین سرعت برای دریافت اطلاعات در مورد یک مورد کلیک شده در شی
ViewHolderاست، زیرا نشان دهنده یک آیتم لیست است.
در حالی که ViewHolder مکانی عالی برای گوش دادن به کلیکها است، اما معمولاً مکان مناسبی برای رسیدگی به آنها نیست. بنابراین، بهترین مکان برای مدیریت کلیک ها چیست؟
-
Adapterموارد داده را در نماها نمایش می دهد، بنابراین می توانید کلیک ها را در آداپتور کنترل کنید. با این حال، وظیفه آداپتور تطبیق داده ها برای نمایش است، نه مقابله با منطق برنامه. - معمولاً باید کلیکها را در
ViewModelمدیریت کنید، زیراViewModelبه دادهها و منطق برای تعیین اینکه در پاسخ به کلیک چه اتفاقی باید بیفتد دسترسی دارد.
مرحله 1: یک شنونده کلیک ایجاد کنید و آن را از طرح بندی آیتم فعال کنید
- در پوشه
sleeptracker، SleepNightAdapter.kt را باز کنید. - در انتهای فایل، در سطح بالا، یک کلاس شنونده جدید،
SleepNightListenerایجاد کنید.
class SleepNightListener() {
}- در کلاس
SleepNightListener، یک تابعonClick()اضافه کنید. هنگامی که روی نمایی که یک آیتم لیست را نمایش می دهد کلیک می شود، view این تابعonClick()را فراخوانی می کند. (شما ویژگیandroid:onClickview را بعداً روی این تابع تنظیم خواهید کرد.)
class SleepNightListener() {
fun onClick() =
}- یک تابع آرگومان
nightاز نوعSleepNightبهonClick()اضافه کنید. نما می داند که چه موردی را نمایش می دهد، و این اطلاعات باید برای مدیریت کلیک منتقل شود.
class SleepNightListener() {
fun onClick(night: SleepNight) =
}- برای تعریف کاری که
onClick()انجام می دهد، در سازندهSleepNightListenerیک پاسخ تماسclickListenerکنید و آن را بهonClick()اختصاص دهید.
نام گذاری به لامبدا که کلیک را کنترل می کند،clickListener، به پیگیری آن در حین ارسال بین کلاس ها کمک می کند. پاسخ به تماسclickListenerفقط بهnight.nightIdبرای دسترسی به داده ها از پایگاه داده نیاز دارد. کلاسSleepNightListenerتمام شده شما باید شبیه کد زیر باشد.
class SleepNightListener(val clickListener: (sleepId: Long) -> Unit) {
fun onClick(night: SleepNight) = clickListener(night.nightId)
}- list_item_sleep_night.xml را باز کنید.
- در داخل بلوک
data، یک متغیر جدید اضافه کنید تا کلاسSleepNightListenerاز طریق اتصال داده در دسترس باشد. به<variable>جدید یکnameclickListener.مطابق شکل زیر،typeرا روی نام کاملاً واجد شرایط کلاسcom.example.android.trackmysleepquality.sleeptracker.SleepNightListenerتنظیم کنید. اکنون می توانید از این طرح به تابعonClick()درSleepNightListenerدسترسی داشته باشید.
<variable
name="clickListener"
type="com.example.android.trackmysleepquality.sleeptracker.SleepNightListener" />- برای گوش دادن به کلیکها روی هر بخشی از این فهرست، ویژگی
android:onClickبهConstraintLayoutاضافه کنید.
همانطور که در زیر نشان داده شده است، مشخصه را رویclickListener:onClick(sleep)با استفاده از یک data binding lambda تنظیم کنید:
android:onClick="@{() -> clickListener.onClick(sleep)}"مرحله 2: شنونده کلیک را به نگهدارنده view و شی binding ارسال کنید
- SleepNightAdapter.kt را باز کنید.
- سازنده کلاس
SleepNightAdapterرا برای دریافتval clickListener: SleepNightListener. هنگامی که آداپتورViewHolderمتصل می کند، باید آن را با این کلیک شنونده ارائه دهد.
class SleepNightAdapter(val clickListener: SleepNightListener):
ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {- در
onBindViewHolder()تماس را بهholder.bind()به روز کنید تا شنونده کلیک را نیز بهViewHolderارسال کنید. شما یک خطای کامپایلر دریافت خواهید کرد زیرا پارامتری را به فراخوانی تابع اضافه کرده اید.
holder.bind(getItem(position)!!, clickListener)- پارامتر
clickListenerرا بهbind()اضافه کنید. برای انجام این کار، مکان نما را روی خطا قرار دهید وAlt+Enter(ویندوز) یاOption+Enter(Mac) را بر روی ارور به را فشار دهید، همانطور که در تصویر زیر نشان داده شده است.
- در داخل کلاس
ViewHolder، در داخل تابعbind()شنونده کلیک را به شیbindingاختصاص دهید. شما یک خطا می بینید زیرا باید شی binding را به روز کنید.
binding.clickListener = clickListener- برای به روز رسانی اتصال داده ها، پروژه خود را تمیز و بازسازی کنید . (شاید لازم باشد حافظه پنهان را نیز باطل کنید.) بنابراین، شما یک کلیک شنونده را از سازنده آداپتور گرفته اید و آن را تا انتها به نگهدارنده view و به شیء binding منتقل کرده اید.
مرحله 3: هنگامی که روی یک مورد ضربه زده می شود، نان تست را نمایش دهید
شما اکنون کدی را برای ثبت کلیک در اختیار دارید، اما آنچه را که هنگام ضربه زدن روی یک آیتم لیست اتفاق میافتد را اجرا نکردهاید. ساده ترین پاسخ نمایش یک نان تست است که با کلیک روی یک آیتم، nightId نشان می دهد. این تأیید می کند که وقتی روی یک آیتم لیست کلیک می شود، nightId صحیح گرفته می شود و ارسال می شود.
- SleepTrackerFragment.kt را باز کنید.
- در
onCreateView()متغیرadapterپیدا کنید. توجه داشته باشید که یک خطا نشان می دهد، زیرا اکنون انتظار یک پارامتر شنونده کلیک را دارد. - با ارسال لامبدا به
SleepNightAdapter، شنونده کلیکی را تعریف کنید. این لامبدا ساده فقط یک نان تست را نشان می دهد کهnightIdنشان می دهد، همانطور که در زیر نشان داده شده است. بایدToastوارد کنید. در زیر تعریف کامل به روز شده است.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})- برنامه را اجرا کنید، روی موارد ضربه بزنید و بررسی کنید که نان تست با
nightIdدرست نمایش داده شوند. از آنجایی که آیتم ها دارای مقادیرnightIdدر حال افزایش هستند و برنامه اولین شب اخیر را نمایش می دهد، موردی با کمترینnightIdدر انتهای لیست قرار دارد.
در این کار، وقتی روی موردی در RecyclerView کلیک میشود، رفتار را تغییر میدهید، بهطوریکه به جای نمایش یک نان تست، برنامه به قسمتی از جزئیات هدایت میشود که اطلاعات بیشتری درباره شب کلیکشده نشان میدهد.
مرحله 1: روی کلیک حرکت کنید
در این مرحله، به جای نمایش یک نان تست، شنونده کلیک لامبدا را در onCreateView() SleepTrackerFragment تغییر میدهید تا nightId را به SleepTrackerViewModel منتقل کنید و پیمایش را به SleepDetailFragment راهاندازی کنید.
تابع کنترل کلیک را تعریف کنید:
- SleepTrackerViewModel.kt را باز کنید.
- در داخل
SleepTrackerViewModel، در انتها، تابع کنترل کننده کلیکonSleepNightClicked()را تعریف کنید.
fun onSleepNightClicked(id: Long) {
}- در داخل
onSleepNightClicked()، با تنظیم_navigateToSleepDetailرویidارسال شده شب خواب کلیک شده، ناوبری را فعال کنید.
fun onSleepNightClicked(id: Long) {
_navigateToSleepDetail.value = id
}- پیاده سازی
_navigateToSleepDetail. همانطور که قبلا انجام داده اید، یکprivate MutableLiveDataبرای وضعیت ناوبری تعریف کنید. و یکvalعمومی برای همراهی با آن.
private val _navigateToSleepDetail = MutableLiveData<Long>()
val navigateToSleepDetail
get() = _navigateToSleepDetail- روشی را برای تماس پس از پایان ناوبری برنامه تعیین کنید. آن را
onSleepDetailNavigated()صدا بزنید و مقدار آن راnullقرار دهید.
fun onSleepDetailNavigated() {
_navigateToSleepDetail.value = null
}کد را برای تماس با کنترل کننده کلیک اضافه کنید:
- SleepTrackerFragment.kt را باز کنید و به کدی بروید که آداپتور را ایجاد می کند و
SleepNightListenerبرای نمایش یک نان تست تعریف می کند.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})- کد زیر را در زیر نان تست برای فراخوانی یک کنترل کننده کلیک،
onSleepNighClicked()درsleepTrackerViewModelهنگام ضربه زدن روی یک مورد اضافه کنید. ازnightIdعبور کنید، تا مدل view بداند کدام شب را باید بخوابد. این شما را با یک خطا مواجه میکند، زیرا هنوزonSleepNightClicked()تعریف نکردهاید. شما می توانید به دلخواه نان تست را نگه دارید، نظر بدهید یا آن را حذف کنید.
sleepTrackerViewModel.onSleepNightClicked(nightId)کد را برای مشاهده کلیک ها اضافه کنید:
- SleepTrackerFragment.kt را باز کنید.
- در
onCreateView()درست بالای اعلانmanager، کدی را برای مشاهدهnavigateToSleepDetailLiveDataجدید اضافه کنید. هنگامی کهnavigateToSleepDetailتغییر می کند، بهSleepDetailFragmentبروید، که درnightمی گذرد، سپسonSleepDetailNavigated()را فراخوانی کنید. از آنجایی که قبلاً این کار را در یک کد قبلی انجام داده اید، کد زیر است:
sleepTrackerViewModel.navigateToSleepDetail.observe(this, Observer { night ->
night?.let {
this.findNavController().navigate(
SleepTrackerFragmentDirections
.actionSleepTrackerFragmentToSleepDetailFragment(night))
sleepTrackerViewModel.onSleepDetailNavigated()
}
})- کد خود را اجرا کنید، روی یک مورد کلیک کنید و ... برنامه از کار می افتد.
مدیریت مقادیر تهی در آداپتورهای اتصال:
- برنامه را دوباره در حالت دیباگ اجرا کنید. روی یک مورد ضربه بزنید و گزارشها را برای نمایش خطاها فیلتر کنید. این یک ردیابی پشته شامل چیزی شبیه آنچه در زیر است را نشان می دهد.
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter itemمتأسفانه، ردیابی پشته مشخص نمی کند که این خطا در کجا ایجاد شده است. یکی از معایب اتصال داده این است که می تواند اشکال زدایی کد شما را سخت تر کند. وقتی روی یک مورد کلیک می کنید، برنامه از کار می افتد و تنها کد جدید مربوط به مدیریت کلیک است.
با این حال، به نظر می رسد که با این مکانیسم جدید مدیریت کلیک، اکنون این امکان وجود دارد که آداپتورهای اتصال با یک مقدار null برای item فراخوانی شوند. به طور خاص، زمانی که برنامه شروع می شود، LiveData به صورت null شروع می شود، بنابراین باید چک های تهی را به هر یک از آداپتورها اضافه کنید.
- در
BindingUtils.kt، برای هر یک از آداپتورهای binding، نوع آرگومانitemرا به nullable تغییر دهید و بدنه را باitem?.let{...}بپیچید. به عنوان مثال، آداپتور شما برایsleepQualityStringبه این شکل خواهد بود. آداپتورهای دیگر را نیز به همین ترتیب تغییر دهید.
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight?) {
item?.let {
text = convertNumericQualityToString(item.sleepQuality, context.resources)
}
}- برنامه خود را اجرا کنید روی یک مورد ضربه بزنید و نمای جزئیات باز می شود.
پروژه 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 اضافه کنید.
درس بعدی را شروع کنید:

