Android Kotlin Fundamentals 07.4: التفاعل مع عناصر RecyclerView

يشكّل هذا الدرس التطبيقي جزءًا من الدورة التدريبية لأساسيات Android Kotlin. ستحصل على أقصى قيمة ممكنة من هذه الدورة التدريبية إذا كنت تستخدم الدروس التطبيقية حول الترميز بشكل متسلسل. يتم إدراج جميع الدروس التطبيقية حول ترميز الدورات التدريبية في الصفحة المقصودة لدروس الترميز Android Kotlin Fundamentals.

مقدمة

تتيح معظم التطبيقات التي تستخدم القوائم والشبكات التي تعرض العناصر للمستخدمين التفاعل مع العناصر. يعتبر النقر على عنصر من القائمة والاطّلاع على تفاصيل العنصر حالة استخدام شائعة جدًا لهذا النوع من التفاعل. لتحقيق ذلك، يمكنك إضافة أدوات معالجة النقرات التي تستجيب لنقرات المستخدمين على العناصر من خلال إظهار عرض التفاصيل.

في هذا الدرس التطبيقي حول الترميز، يمكنك إضافة تفاعل إلى RecyclerView، استنادًا إلى إصدار موسّع من تطبيق تتبُّع النوم من السلسلة السابقة من الدروس التطبيقية حول الترميز.

ما يجب معرفته

  • إنشاء واجهة مستخدم أساسية باستخدام النشاط والأجزاء والمشاهدات.
  • التنقّل بين الأجزاء واستخدام safeArgs لتمرير البيانات بين الأجزاء
  • عرض النماذج وعرض مصانع النماذج والتحوّلات وLiveData ومراصدها.
  • كيفية إنشاء قاعدة بيانات Room وإنشاء كائن الوصول إلى البيانات (DAO) وتحديد الكيانات.
  • كيفية استخدام الكوروتينات في قاعدة البيانات والمهام الأخرى الطويلة الأمد
  • كيفية تنفيذ RecyclerView أساسي باستخدام Adapter وViewHolder وتنسيق العنصر.
  • كيفية تنفيذ ربط البيانات في RecyclerView.
  • كيفية إنشاء محوّلات ربط واستخدامها لتحويل البيانات.
  • كيفية استخدام GridLayoutManager

ما ستتعرَّف عليه

  • كيفية جعل العناصر في RecyclerView قابلة للنقر. نفِّذ أداة معالجة نقرة للانتقال إلى عرض التفاصيل عند النقر على عنصر.

الإجراءات التي ستنفذّها

  • استنِد إلى إصدار موسّع من تطبيقTrackMySleepquality من الدرس التطبيقي السابق حول الترميز في هذه السلسلة.
  • يمكنك إضافة مستمع نقر إلى قائمتك وبدء الاستماع إلى تفاعل المستخدم. عند النقر على عنصر في القائمة، يتم تشغيل التنقل إلى جزء يحتوي على تفاصيل العنصر الذي تم النقر عليه. يوفر رمز إجراء التفعيل رمزًا لجزء التفاصيل، بالإضافة إلى رمز التنقل.

يتضمّن تطبيق بدء تتبُّع النوم شاشتين، على شكل أجزاء، كما هو موضّح في الشكل التالي.

تحتوي الشاشة الأولى، على الجانب الأيمن، على أزرار لبدء التتبع وإيقافه. تعرض الشاشة بعض بيانات النوم للمستخدم. يعمل الزر محو على حذف جميع البيانات التي جمعها التطبيق للمستخدم نهائيًا. الشاشة الثانية، التي تظهر على اليسار، مخصّصة لاختيار تقييم جودة النوم.

يستخدم هذا التطبيق بنية مبسّطة مع وحدة تحكم واجهة مستخدم ونموذج عرض وLiveData وقاعدة بيانات Room للاحتفاظ ببيانات النوم.

في هذا الدرس التطبيقي حول الترميز، يمكنك إضافة إمكانية الاستجابة عندما ينقر المستخدم على عنصر في الشبكة، ما يؤدي إلى عرض شاشة تفاصيل مثل العنصر أدناه. يتم تقديم رمز هذه الشاشة (الجزء ونموذج العرض والتنقُّل) مع تطبيق إجراء التفعيل، وستُطبِّق آلية معالجة النقرات.

الخطوة 1: الحصول على تطبيق إجراء التفعيل

  1. نزِّل رمز RecyclerViewClickHandler-Starter من GitHub وافتح المشروع في "استوديو Android".
  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 وافحصه. يحصل نموذج الملف الشخصي هذا على مفتاح SleepNight وDAO في المُنشئ.

    يحتوي نص الصف على رمز للحصول على SleepNight للمفتاح المحدد، والمتغيّر navigateToSleepTracker للتحكم في التنقل مرة أخرى إلى SleepTrackerFragment عند الضغط على الزر إغلاق.

    تعرض الدالة getNightWithId() خطأ LiveData<SleepNight> ويتم تعريفه في SleepDatabaseDao (في الحزمة database).

  3. في حزمة sleepdetail، افتح رمز SleepDetailFragment وافحصه. يُرجى ملاحظة إعداد ربط البيانات ونموذج العرض وجهاز المراقبة للتنقل.

  4. في حزمة sleepdetail، افتح رمز SleepDetailViewModelFactory وافحصه.

  5. في مجلد التنسيق، افحص fragment_sleep_detail.xml. يُرجى ملاحظة المتغيّر sleepDetailViewModel المحدّد في العلامة <data> للحصول على البيانات المراد عرضها في كل ملف شخصي من نموذج العرض.

    يحتوي التنسيق على 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، افتَح SleepNightAdaptiveer.kt.
  2. في نهاية الملف، أنشِئ صفًا جديدًا للمستمعين SleepNightListener على المستوى الأعلى.
class SleepNightListener() {
    
}
  1. أضِف دالة onClick() داخل الفئة SleepNightListener. عندما يتم النقر على الملف الشخصي الذي يعرض عنصرًا في القائمة، يطلب الملف الشخصي دالة onClick() هذه. (سيتم ضبط الخاصية android:onClick للملف الشخصي لاحقًا لهذه الدالة.)
class SleepNightListener() {
    fun onClick() = 
}
  1. أضِف وسيطة دالة night من النوع SleepNight إلى onClick(). وتعرف طريقة العرض العنصر الذي تعرضه، ويجب تمرير المعلومات لمعالجة النقرة.
class SleepNightListener() {
    fun onClick(night: SleepNight) = 
}
  1. لتحديد وظيفة onClick()، يمكنك تقديم استدعاء clickListener في منشئ SleepNightListener وضبطه لـ 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) باستخدام لامدا لربط البيانات، كما هو موضّح أدناه:
android:onClick="@{() -> clickListener.onClick(sleep)}"

الخطوة 2: تمرير المستمع عند النقر إلى صاحب العرض والكائن المُلزِم

  1. افتح SleepNightAdaptiveer.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 (نظام التشغيل Windows) أو Option+Enter (نظام التشغيل Mac) على الخطأ إلى ، كما هو موضح في لقطة الشاشة أدناه.

  1. داخل الفئة ViewHolder، داخل الدالة bind()، خصِّص أداة معالجة النقرات للعنصر binding. تظهر لك رسالة خطأ لأنك بحاجة إلى تعديل العنصر المُلزِم.
binding.clickListener = clickListener
  1. لتعديل ربط البيانات، نظِّف أو أعِد إنشاء مشروعك. (قد تحتاج إلى إلغاء صلاحية ذاكرات التخزين المؤقت أيضًا). إذن، بعد أن استمعت إلى أداة معالجة النقرات من أداة إنشاء المحوّلات، ونجحت في تمريرها بالكامل إلى شاشة العرض وإلى العنصر الملزِم.

الخطوة 3: عرض الخبز المحمص عند النقر على عنصر

أصبح لديك الآن الرمز البرمجي لالتقاط النقرة، ولكنك لم تنفّذ ما يحدث عند النقر على عنصر في القائمة. وأبسط الاستجابة هي عرض نخب يُظهر nightId عند النقر على عنصر. يتحقق ذلك من أنه عند النقر على عنصر في القائمة، يتم التقاط nightId الصحيح وتمريره.

  1. افتح SleepTrackerFragment.kt.
  2. في onCreateView()، ابحث عن المتغير adapter. تجدر الإشارة إلى أنه يتم عرض رسالة خطأ، لأنها تتوقّع الآن معلّمة مستمعًا للنقرة.
  3. حدِّد أداة معالجة نقر من خلال تمرير lambda إلى SleepNightAdapter. تعرض lambda البسيطة توستًا يعرض nightId، كما هو موضّح أدناه. يجب استيراد Toast. وفي ما يلي التعريف المُعدَّل الكامل.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
   Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})
  1. شغِّل التطبيق وانقر على العناصر وتأكّد من أنها تعرض الخبز المحمص باستخدام الحقل nightId الصحيح. نظرًا لأن العناصر تزيد على nightId من القيم، ويعرض التطبيق أحدث ليلة أولاً، يظهر العنصر الذي يتضمن أدنى nightId في أسفل القائمة.

في هذه المَهمّة، يمكنك تغيير السلوك عندما يتم النقر على عنصر في RecyclerView، بحيث بدلاً من عرض الخبز المحمّل، سينتقل التطبيق إلى جزء التفاصيل الذي يعرض المزيد من المعلومات عن الليلة التي تم النقر عليها.

الخطوة الأولى: التنقل عند النقر

في هذه الخطوة، بدلاً من عرض الخبز المحمّص فقط، يمكنك تغيير أداة النقر lambda في 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، عَلَشَانْ كِدَهْ يِعْرِفْ طَرِيقِ الْمُشَاهْدَة أَنْهِي لِيلَة تَنَامْ. سيؤدي ذلك إلى حدوث خطأ، لأنك لم تحدِّد 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، بالنسبة إلى كل محوّلات ربط، غيّر نوع الوسيطة item إلى خالية، ثم ضمِّن الملف بما يلي item?.let{...}. على سبيل المثال، سيظهر محوّل sleepQualityString بالشكل التالي. ويمكنك تغيير المحوّلات الأخرى بالطريقة نفسها.
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight?) {
   item?.let {
       text = convertNumericQualityToString(item.sleepQuality, context.resources)
   }
}
  1. شغِّل تطبيقك. انقر على عنصر ليتم فتح عرض التفاصيل.

مشروع "استوديو 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 دائمًا.

بدء الدرس التالي: 7.5: Headers in RecyclerView