تخصيص قائمة ديناميكية جزء من Android Jetpack.
يمكنك تخصيص
RecyclerView
العناصر لتلبية احتياجاتك المحدّدة. توفّر الفئات العادية الموضّحة في مقالة إنشاء قوائم ديناميكية باستخدام RecyclerView جميع الوظائف التي يحتاجها معظم المطوّرين. في كثير من الحالات، ما عليك سوى تصميم طريقة العرض لكل حاوية عرض وكتابة الرمز البرمجي لتعديل طرق العرض هذه باستخدام البيانات المناسبة. ومع ذلك، إذا كان تطبيقك يتضمّن متطلبات محدّدة، يمكنك تعديل السلوك العادي بعدة طرق.
يوضِّح هذا المستند بعض عمليات التخصيص المحتملة.
تعديل التنسيق
تستخدم RecyclerView أداة إدارة تنسيق لتحديد موضع العناصر الفردية على الشاشة وتحديد وقت إعادة استخدام طرق عرض العناصر التي لم يعُد بإمكان المستخدم رؤيتها. لإعادة استخدام طريقة عرض أو إعادة تدويرها، قد يطلب مدير التنسيق من المحوّل استبدال محتوى طريقة العرض بعنصر مختلف من مجموعة البيانات. تؤدي إعادة استخدام طرق العرض بهذه الطريقة إلى تحسين الأداء من خلال تجنُّب إنشاء طرق عرض غير ضرورية أو إجراء عمليات بحث مكلفة.findViewById() تتضمّن "مكتبة الدعم في Android" ثلاثة أدوات عادية لإدارة التنسيقات، يوفّر كل منها العديد من خيارات التخصيص:
-
LinearLayoutManager: ترتّب العناصر في قائمة أحادية الأبعاد. يوفّر استخدامRecyclerViewمعLinearLayoutManagerوظائف مشابهة لتنسيقListView. GridLayoutManager: ترتّب العناصر في شبكة ثنائية الأبعاد، مثل المربّعات على لوحة الشطرنج. يوفّر استخدامRecyclerViewمعGridLayoutManagerوظائف مثل تخطيطGridView.- تعرض
StaggeredGridLayoutManagerالعناصر في شبكة ثنائية الأبعاد، مع إزاحة طفيفة لكل عمود عن العمود السابق، مثل النجوم على العلم الأمريكي.
إذا لم تناسبك أدوات إدارة التنسيق هذه، يمكنك إنشاء أدواتك الخاصة من خلال توسيع
RecyclerView.LayoutManager
فئة مجرّدة.
إضافة صور متحركة للعناصر
عندما يتغيّر عنصر ما، تستخدم RecyclerView أداة تحريك
لتغيير مظهره. هذا العنصر المتحرّك هو كائن يوسّع فئة RecyclerView.ItemAnimator المجردة. تستخدم RecyclerView تلقائيًا
DefaultItemAnimator
لتوفير الصورة المتحركة. إذا أردت توفير رسوم متحركة مخصّصة، يمكنك تحديد عنصر رسوم متحركة خاص بك من خلال توسيع RecyclerView.ItemAnimator.
تفعيل اختيار عناصر القائمة
تتيح مكتبة
recyclerview-selection
للمستخدمين اختيار عناصر في قائمة RecyclerView باستخدام اللمس أو إدخال الماوس. يتيح لك ذلك الاحتفاظ بالتحكّم في العرض المرئي لعنصر محدّد. يمكنك أيضًا الاحتفاظ بالتحكّم في السياسات التي تتحكّم في سلوك الاختيار، مثل العناصر المؤهَّلة للاختيار وعدد العناصر التي يمكن اختيارها.
لإتاحة إمكانية التحديد في مثيل RecyclerView، اتّبِع الخطوات التالية:
- حدِّد نوع مفتاح الاختيار الذي تريد استخدامه، ثم أنشئ
ItemKeyProvider.هناك ثلاثة أنواع رئيسية يمكنك استخدامها لتحديد العناصر المحدّدة:
Parcelableوفئاته الفرعية، مثلUriStringLong
للحصول على معلومات مفصّلة حول أنواع مفاتيح الاختيار، يُرجى الاطّلاع على
SelectionTracker.Builder. - نفِّذ
ItemDetailsLookup. - عدِّل عناصر
ViewفيRecyclerViewلتعكس ما إذا كان المستخدم يختارها أو يزيل اختيارها.لا توفّر مكتبة الاختيار زخرفة مرئية تلقائية للعناصر المحدّدة. يجب تقديم هذا المعرّف عند تنفيذ
onBindViewHolder(). ننصحك باتّباع الأسلوب التالي:- في
onBindViewHolder()، استدعِsetActivated()—ليسsetSelected()—على الكائنViewباستخدامtrueأوfalse، وذلك حسب ما إذا كان العنصر محدّدًا. - عدِّل تصميم العرض لتمثيل الحالة المفعَّلة. ننصحك باستخدام مصدر قائمة حالات الألوان لإعداد التصميم.
- في
- استخدِم
ActionModeلتزويد المستخدم بأدوات لتنفيذ إجراء بشأن النص المحدّد. - تنفيذ أي إجراءات ثانوية تم تفسيرها
- تجميع كل شيء باستخدام
SelectionTracker.Builder - تضمين عملية الاختيار في أحداث دورة حياة النشاط
تتيح ItemDetailsLookup لمكتبة الاختيار الوصول إلى معلومات حول عناصر RecyclerView باستخدام MotionEvent.
وهي في الواقع مصنع لإنشاء مثيلات من
ItemDetails
يتم الاحتفاظ بنسخة احتياطية منها أو استخراجها من مثيل
RecyclerView.ViewHolder.
سجِّل
SelectionTracker.SelectionObserver
لتلقّي إشعار عند تغيير أي خيار. عند إنشاء تحديد لأول مرة، ابدأ ActionMode لعرضه للمستخدم وتوفير إجراءات خاصة بالتحديد. على سبيل المثال، يمكنك إضافة زر حذف إلى شريط ActionMode وربط سهم الرجوع في الشريط بإزالة التحديد. عندما يصبح التحديد فارغًا، أي إذا محا المستخدم التحديد في المرة الأخيرة، يجب إنهاء وضع الإجراء.
في نهاية مسار معالجة الأحداث، قد تحدّد المكتبة أنّ المستخدم يحاول تفعيل عنصر من خلال النقر عليه، أو يحاول سحب عنصر أو مجموعة من العناصر المحدّدة. يمكنك التفاعل مع هذه التفسيرات من خلال تسجيل أداة المعالجة المناسبة. لمزيد من المعلومات، يُرجى الاطّلاع على SelectionTracker.Builder.
يوضّح المثال التالي كيفية تجميع هذه الأجزاء معًا:
Kotlin
var tracker = SelectionTracker.Builder( "my-selection-id", recyclerView, StableIdKeyProvider(recyclerView), MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build()
Java
SelectionTracker tracker = new SelectionTracker.Builder<>( "my-selection-id", recyclerView, new StableIdKeyProvider(recyclerView), new MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build();
لإنشاء مثيل SelectionTracker، يجب أن يوفّر تطبيقك RecyclerView.Adapter نفسه الذي تستخدمه لتهيئة RecyclerView إلى SelectionTracker.Builder. لهذا السبب، بعد إنشاء مثيل SelectionTracker، عليك إدراجه في RecyclerView.Adapter. في ما عدا ذلك، لا يمكنك التحقّق من حالة عنصر محدّد باستخدام طريقة onBindViewHolder().
للحفاظ على حالة التحديد في جميع أحداث مراحل نشاط التطبيق، يجب أن يستدعي تطبيقك الطريقتَين onSaveInstanceState() وonRestoreInstanceState() من أداة تتبُّع التحديد من الطريقتَين onSaveInstanceState() وonRestoreInstanceState() من النشاط على التوالي. يجب أن يوفّر تطبيقك أيضًا معرّف اختيار فريدًا للدالة الإنشائية SelectionTracker.Builder. هذا المعرّف مطلوب لأنّه قد يحتوي نشاط أو جزء على أكثر من قائمة واحدة مميزة وقابلة للتحديد، ويجب الاحتفاظ بجميعها في حالتها المحفوظة.
مراجع إضافية
يمكنك الاطّلاع على المراجع التالية للحصول على معلومات إضافية.
- تطبيق Sunflower التجريبي الذي يستخدم
RecyclerView - الدرس التطبيقي حول الترميز بعنوان "استخدام RecyclerView لعرض قائمة قابلة للتمرير"
- درس تطبيقي حول أساسيات Kotlin على Android: أساسيات RecyclerView