تخصيص قائمة ديناميكية   جزء من Android Jetpack.

تجربة ميزة "الكتابة"
‫Jetpack Compose هي مجموعة أدوات واجهة المستخدم المُقترَحة لنظام التشغيل Android. تعرَّف على كيفية العمل مع التنسيقات في ميزة "الإنشاء".

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

تعديل التنسيق

يستخدم RecyclerView مدير تنسيق لوضع العناصر الفردية على الشاشة وتحديد وقت إعادة استخدام طرق عرض العناصر التي لم يعُد يظهرها للمستخدم. لإعادة استخدام عرض أو إعادة تدويره، قد يطلب مدير ملف التنسيق من المحوِّل استبدال محتوى العرض بعنصر مختلف من مجموعة البيانات. تؤدي إعادة استخدام المشاهدات بهذه الطريقة إلى تحسين الأداء من خلال تجنُّب إنشاء مشاهدات غير ضرورية أو إجراء عمليات بحث findViewById() مكلفة. تتضمّن مكتبة Android Support Library ثلاثة مدراء تنسيقات عاديين، يقدّم كلٌّ منها العديد من خيارات التخصيص:

  • LinearLayoutManager: لترتيب العناصر في قائمة أحادية البعد يوفر استخدام RecyclerView مع LinearLayoutManager وظائف مثل تنسيق ListView.
  • GridLayoutManager: يرتّب العناصر في شبكة ثنائية الأبعاد، مثل المربّعات على قطعة شطرنج. يوفر استخدام RecyclerView مع GridLayoutManager وظائف مثل تنسيق GridView.
  • StaggeredGridLayoutManager: تُرتّب العناصر في شبكة ثنائية الأبعاد، مع وضع كل عمود قليلاً عن العمود السابق، مثل النجوم على العلم الأمريكي.

إذا لم تكن هذه أدوات إدارة التنسيقات تناسب احتياجاتك، يمكنك إنشاء أداة خاصة بك من خلال توسيع RecyclerView.LayoutManager الفئة المجردة.

إضافة صور متحركة للعناصر

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

تفعيل اختيار عناصر القائمة

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

لإضافة ميزة الاختيار إلى مثيل RecyclerView، اتّبِع الخطوات التالية:

  1. حدِّد نوع مفتاح الاختيار الذي تريد استخدامه، ثمّ أنشئ ItemKeyProvider.

    هناك ثلاثة أنواع رئيسية يمكنك استخدامها لتحديد العناصر المحدّدة:

    للحصول على معلومات تفصيلية عن أنواع مفاتيح الاختيار، يُرجى الاطّلاع على SelectionTracker.Builder.

  2. تنفيذ ItemDetailsLookup
  3. يتيح ItemDetailsLookup لـ "مكتبة الاختيار" الوصول إلى معلومات عن RecyclerView عنصر معيّن باستخدام MotionEvent. وهو بمثابة مصنع لإنشاء مثيلات ItemDetails التي يتم الاحتفاظ بنسخة احتياطية منها أو استخراجها من مثيل RecyclerView.ViewHolder.

  4. عدِّل View عنصرًا في RecyclerView ليعكس ما إذا كان المستخدم قد اختَاره أو ألغى اختياره.

    لا توفّر مكتبة الاختيار زخرفة مرئية تلقائية للعناصر المحدّدة. قدِّم هذه المعلومات عند تنفيذ onBindViewHolder(). ننصحك بالنهج التالي:

    • في onBindViewHolder()، استخدِم الإجراء setActivated()وليس setSelected()—في العنصر View مع true أو false، استنادًا إلى ما إذا كان العنصر محدّدًا.
    • عدِّل تصميم طريقة العرض لتمثيل الحالة المفعَّلة. ننصحك باستخدام مصدر قائمة حالة لون لضبط التصميم.
  5. استخدِم ActionMode لإتاحة أدوات للمستخدم لتنفيذ إجراء على العنصر المحدّد.
  6. سجِّل SelectionTracker.SelectionObserver لتلقّي إشعار عند تغيير أحد الخيارات. عند إنشاء اختيار لأول مرة، ابدأ ActionMode بعرض هذا الاختيار للمستخدم وتقديم إجراءات خاصة بالاختيار. على سبيل المثال، يمكنك إضافة زر حذف إلى شريط ActionMode وربط سهم الرجوع في الشريط لمحو الاختيار. عند إزالة المحتوى من الاختيار، إذا أزال المستخدم الاختيار في المرة الأخيرة، يمكنك إنهاء وضع الإجراء.

  7. تنفيذ أي إجراءات ثانوية تم تفسيرها
  8. في نهاية مسار معالجة الأحداث، قد تحدّد المكتبة أنّ المستخدم يحاول تفعيل عنصر من خلال النقر عليه، أو هو يحاول سحب عنصر أو مجموعة من العناصر المحدّدة. يمكنك التفاعل مع هذه التفسيرات من خلال تسجيل أداة الاستماع المناسبة. لمزيد من المعلومات، يُرجى الاطّلاع على SelectionTracker.Builder.

  9. تجميع كل العناصر باستخدام SelectionTracker.Builder
  10. يوضّح المثال التالي كيفية تجميع هذه القطع معًا:

    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().

  11. أدرِج الاختيار في أحداث نشاط دورة الحياة.
  12. للحفاظ على حالة الاختيار في جميع أحداث دورة حياة النشاط، يجب أن يُطلِق تطبيقك onSaveInstanceState() وonRestoreInstanceState() من onSaveInstanceState() وonRestoreInstanceState() في النشاط، على التوالي. يجب أن يقدّم تطبيقك أيضًا معرّف اختيار فريدًا إلى SelectionTracker.Builder constructor. هذا المعرّف مطلوب لأنّه قد يتضمّن النشاط أو المقتطف أكثر من قائمة واحدة مميزة وقابلة للاختيار، ويجب الاحتفاظ بجميعها في حالتها المحفوظة.

مصادر إضافية

يمكنك الاطّلاع على المراجع التالية للحصول على معلومات إضافية.