تخصيص قائمة ديناميكية جزء من 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
وفئاته الفرعية، مثلUri
String
Long
للحصول على معلومات مفصّلة حول أنواع مفاتيح الاختيار، يُرجى الاطّلاع على
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 لعرض قائمة قابلة للتمرير"
- دورة الترميز أساسيات Android Kotlin: أساسيات RecyclerView