يشكّل هذا الدرس التطبيقي جزءًا من الدورة التدريبية لأساسيات Android Kotlin. ستحصل على أقصى قيمة ممكنة من هذه الدورة التدريبية إذا كنت تستخدم الدروس التطبيقية حول الترميز بشكل متسلسل. يتم إدراج جميع الدروس التطبيقية حول ترميز الدورات التدريبية في الصفحة المقصودة لدروس الترميز Android Kotlin Fundamentals.
مقدمة
تتيح معظم التطبيقات التي تستخدم القوائم والشبكات التي تعرض العناصر للمستخدمين التفاعل مع العناصر. يعتبر النقر على عنصر من القائمة والاطّلاع على تفاصيل العنصر حالة استخدام شائعة جدًا لهذا النوع من التفاعل. لتحقيق ذلك، يمكنك إضافة أدوات معالجة النقرات التي تستجيب لنقرات المستخدمين على العناصر من خلال إظهار عرض التفاصيل.
في هذا الدرس التطبيقي حول الترميز، يمكنك إضافة تفاعل إلى RecyclerView
، استنادًا إلى إصدار موسّع من تطبيق تتبُّع النوم من السلسلة السابقة من الدروس التطبيقية حول الترميز.
ما يجب معرفته
- إنشاء واجهة مستخدم أساسية باستخدام النشاط والأجزاء والمشاهدات.
- التنقّل بين الأجزاء واستخدام
safeArgs
لتمرير البيانات بين الأجزاء - عرض النماذج وعرض مصانع النماذج والتحوّلات و
LiveData
ومراصدها. - كيفية إنشاء قاعدة بيانات
Room
وإنشاء كائن الوصول إلى البيانات (DAO) وتحديد الكيانات. - كيفية استخدام الكوروتينات في قاعدة البيانات والمهام الأخرى الطويلة الأمد
- كيفية تنفيذ
RecyclerView
أساسي باستخدامAdapter
وViewHolder
وتنسيق العنصر. - كيفية تنفيذ ربط البيانات في
RecyclerView
. - كيفية إنشاء محوّلات ربط واستخدامها لتحويل البيانات.
- كيفية استخدام
GridLayoutManager
ما ستتعرَّف عليه
- كيفية جعل العناصر في
RecyclerView
قابلة للنقر. نفِّذ أداة معالجة نقرة للانتقال إلى عرض التفاصيل عند النقر على عنصر.
الإجراءات التي ستنفذّها
- استنِد إلى إصدار موسّع من تطبيقTrackMySleepquality من الدرس التطبيقي السابق حول الترميز في هذه السلسلة.
- يمكنك إضافة مستمع نقر إلى قائمتك وبدء الاستماع إلى تفاعل المستخدم. عند النقر على عنصر في القائمة، يتم تشغيل التنقل إلى جزء يحتوي على تفاصيل العنصر الذي تم النقر عليه. يوفر رمز إجراء التفعيل رمزًا لجزء التفاصيل، بالإضافة إلى رمز التنقل.
يتضمّن تطبيق بدء تتبُّع النوم شاشتين، على شكل أجزاء، كما هو موضّح في الشكل التالي.
تحتوي الشاشة الأولى، على الجانب الأيمن، على أزرار لبدء التتبع وإيقافه. تعرض الشاشة بعض بيانات النوم للمستخدم. يعمل الزر محو على حذف جميع البيانات التي جمعها التطبيق للمستخدم نهائيًا. الشاشة الثانية، التي تظهر على اليسار، مخصّصة لاختيار تقييم جودة النوم.
يستخدم هذا التطبيق بنية مبسّطة مع وحدة تحكم واجهة مستخدم ونموذج عرض وLiveData
وقاعدة بيانات Room
للاحتفاظ ببيانات النوم.
في هذا الدرس التطبيقي حول الترميز، يمكنك إضافة إمكانية الاستجابة عندما ينقر المستخدم على عنصر في الشبكة، ما يؤدي إلى عرض شاشة تفاصيل مثل العنصر أدناه. يتم تقديم رمز هذه الشاشة (الجزء ونموذج العرض والتنقُّل) مع تطبيق إجراء التفعيل، وستُطبِّق آلية معالجة النقرات.
الخطوة 1: الحصول على تطبيق إجراء التفعيل
- نزِّل رمز RecyclerViewClickHandler-Starter من GitHub وافتح المشروع في "استوديو Android".
- إنشاء وتشغيل تطبيق تتبُّع النوم للمبتدئين
[اختياري] تحديث التطبيق إذا كنت تريد استخدام التطبيق من الدرس التطبيقي السابق
إذا كنت تنوي الانتقال من تطبيق المبتدئين الذي تم تقديمه في 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
وافحصه. يحصل نموذج الملف الشخصي هذا على مفتاحSleepNight
وDAO في المُنشئ.
يحتوي نص الصف على رمز للحصول علىSleepNight
للمفتاح المحدد، والمتغيّرnavigateToSleepTracker
للتحكم في التنقل مرة أخرى إلىSleepTrackerFragment
عند الضغط على الزر إغلاق.
تعرض الدالةgetNightWithId()
خطأLiveData<SleepNight>
ويتم تعريفه فيSleepDatabaseDao
(في الحزمةdatabase
). - في حزمة
sleepdetail
، افتح رمزSleepDetailFragment
وافحصه. يُرجى ملاحظة إعداد ربط البيانات ونموذج العرض وجهاز المراقبة للتنقل. - في حزمة
sleepdetail
، افتح رمزSleepDetailViewModelFactory
وافحصه. - في مجلد التنسيق، افحص
fragment_sleep_detail.xml
. يُرجى ملاحظة المتغيّرsleepDetailViewModel
المحدّد في العلامة<data>
للحصول على البيانات المراد عرضها في كل ملف شخصي من نموذج العرض.
يحتوي التنسيق على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
، افتَح SleepNightAdaptiveer.kt. - في نهاية الملف، أنشِئ صفًا جديدًا للمستمعين
SleepNightListener
على المستوى الأعلى.
class SleepNightListener() {
}
- أضِف دالة
onClick()
داخل الفئةSleepNightListener
. عندما يتم النقر على الملف الشخصي الذي يعرض عنصرًا في القائمة، يطلب الملف الشخصي دالةonClick()
هذه. (سيتم ضبط الخاصيةandroid:onClick
للملف الشخصي لاحقًا لهذه الدالة.)
class SleepNightListener() {
fun onClick() =
}
- أضِف وسيطة دالة
night
من النوعSleepNight
إلىonClick()
. وتعرف طريقة العرض العنصر الذي تعرضه، ويجب تمرير المعلومات لمعالجة النقرة.
class SleepNightListener() {
fun onClick(night: SleepNight) =
}
- لتحديد وظيفة
onClick()
، يمكنك تقديم استدعاءclickListener
في منشئSleepNightListener
وضبطه لـ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>
الجديدname
منclickListener.
اضبط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)
باستخدام لامدا لربط البيانات، كما هو موضّح أدناه:
android:onClick="@{() -> clickListener.onClick(sleep)}"
الخطوة 2: تمرير المستمع عند النقر إلى صاحب العرض والكائن المُلزِم
- افتح SleepNightAdaptiveer.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
(نظام التشغيل Windows) أوOption+Enter
(نظام التشغيل Mac) على الخطأ إلى ، كما هو موضح في لقطة الشاشة أدناه.
- داخل الفئة
ViewHolder
، داخل الدالةbind()
، خصِّص أداة معالجة النقرات للعنصرbinding
. تظهر لك رسالة خطأ لأنك بحاجة إلى تعديل العنصر المُلزِم.
binding.clickListener = clickListener
- لتعديل ربط البيانات، نظِّف أو أعِد إنشاء مشروعك. (قد تحتاج إلى إلغاء صلاحية ذاكرات التخزين المؤقت أيضًا). إذن، بعد أن استمعت إلى أداة معالجة النقرات من أداة إنشاء المحوّلات، ونجحت في تمريرها بالكامل إلى شاشة العرض وإلى العنصر الملزِم.
الخطوة 3: عرض الخبز المحمص عند النقر على عنصر
أصبح لديك الآن الرمز البرمجي لالتقاط النقرة، ولكنك لم تنفّذ ما يحدث عند النقر على عنصر في القائمة. وأبسط الاستجابة هي عرض نخب يُظهر nightId
عند النقر على عنصر. يتحقق ذلك من أنه عند النقر على عنصر في القائمة، يتم التقاط nightId
الصحيح وتمريره.
- افتح SleepTrackerFragment.kt.
- في
onCreateView()
، ابحث عن المتغيرadapter
. تجدر الإشارة إلى أنه يتم عرض رسالة خطأ، لأنها تتوقّع الآن معلّمة مستمعًا للنقرة. - حدِّد أداة معالجة نقر من خلال تمرير lambda إلى
SleepNightAdapter
. تعرض lambda البسيطة توستًا يعرضnightId
، كما هو موضّح أدناه. يجب استيرادToast
. وفي ما يلي التعريف المُعدَّل الكامل.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})
- شغِّل التطبيق وانقر على العناصر وتأكّد من أنها تعرض الخبز المحمص باستخدام الحقل
nightId
الصحيح. نظرًا لأن العناصر تزيد علىnightId
من القيم، ويعرض التطبيق أحدث ليلة أولاً، يظهر العنصر الذي يتضمن أدنىnightId
في أسفل القائمة.
في هذه المَهمّة، يمكنك تغيير السلوك عندما يتم النقر على عنصر في RecyclerView
، بحيث بدلاً من عرض الخبز المحمّل، سينتقل التطبيق إلى جزء التفاصيل الذي يعرض المزيد من المعلومات عن الليلة التي تم النقر عليها.
الخطوة الأولى: التنقل عند النقر
في هذه الخطوة، بدلاً من عرض الخبز المحمّص فقط، يمكنك تغيير أداة النقر lambda في 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
، عَلَشَانْ كِدَهْ يِعْرِفْ طَرِيقِ الْمُشَاهْدَة أَنْهِي لِيلَة تَنَامْ. سيؤدي ذلك إلى حدوث خطأ، لأنك لم تحدِّدonSleepNightClicked()
بعد. يمكنك الاحتفاظ بالخبز المحمّص أو التعليق عليه أو حذفه، كما تريد.
sleepTrackerViewModel.onSleepNightClicked(nightId)
أضف الرمز لملاحظة النقرات:
- افتَح SleepTrackerFragment.kt.
- في
onCreateView()
، فوق تعريفmanager
مباشرةً، أضف رمزًا لمراقبةnavigateToSleepDetail
LiveData
الجديدة. عندما تتغير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
، بالنسبة إلى كل محوّلات ربط، غيّر نوع الوسيطةitem
إلى خالية، ثم ضمِّن الملف بما يليitem?.let{...}
. على سبيل المثال، سيظهر محوّلsleepQualityString
بالشكل التالي. ويمكنك تغيير المحوّلات الأخرى بالطريقة نفسها.
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight?) {
item?.let {
text = convertNumericQualityToString(item.sleepQuality, context.resources)
}
}
- شغِّل تطبيقك. انقر على عنصر ليتم فتح عرض التفاصيل.
مشروع "استوديو Android": RecyclerViewClickHandler
لجعل العناصر في RecyclerView
ردًا على النقرات، يمكنك إرفاق مستمعين للنقر على القائمة لإدراج العناصر في ViewHolder
، والتعامل مع النقرات في ViewModel
.
لجعل العناصر في RecyclerView
ترد على النقرات، تحتاج إلى إجراء ما يلي:
- أنشِئ صفًا للمستمع يتولّى lambda ويخصّصها لدالة
onClick()
.
class SleepNightListener(val clickListener: (sleepId: Long) -> Unit) {
fun onClick(night: SleepNight) = clickListener(night.nightId)
}
- اضبط أداة معالجة النقر في طريقة العرض.
android:onClick="@{() -> clickListener.onClick(sleep)}"
- مرِّر أداة معالجة النقرات إلى أداة إنشاء المحوّلات وحوِّلها إلى حامل العرض، ثم أضِفها إلى العنصر المُلزِم.
class SleepNightAdapter(val clickListener: SleepNightListener):
ListAdapter<DataItem, RecyclerView.ViewHolder>(SleepNightDiffCallback()
holder.bind(getItem(position)!!, clickListener)
binding.clickListener = clickListener
- في الجزء الذي يُظهر شاشة إعادة التدوير، حيث تُنشئ المحوّل، حدِّد أداة معالجة نقر من خلال تمرير لمدا إلى المحوّل.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
sleepTrackerViewModel.onSleepNightClicked(nightId)
})
- نفِّذ معالج النقر في نموذج العرض. بالنسبة إلى النقرات على عناصر القائمة، يؤدي هذا عادةً إلى تشغيل الانتقال إلى جزء التفاصيل.
دورة Udacity:
مستندات مطوّر برامج Android:
يسرد هذا القسم المهام الدراسية المحتملة للطلاب الذين يعملون من خلال هذا الدرس التطبيقي حول الترميز في إطار دورة تدريبية يُديرها معلِّم. يجب أن ينفِّذ المعلّم ما يلي:
- يمكنك تخصيص واجب منزلي إذا لزم الأمر.
- التواصل مع الطلاب بشأن كيفية إرسال الواجبات المنزلية
- وضع درجات للواجبات المنزلية.
ويمكن للمعلّمين استخدام هذه الاقتراحات بقدر ما يريدون أو بقدر ما يريدون، ويجب عدم التردد في تخصيص أي واجبات منزلية أخرى مناسبة.
إذا كنت تستخدم هذا الدرس التطبيقي بنفسك، يمكنك استخدام هذه الواجبات المنزلية لاختبار معلوماتك.
الإجابة عن هذه الأسئلة
السؤال 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
دائمًا.
بدء الدرس التالي: