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

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

يمكنك تخصيص 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، اتّبِع الخطوات التالية:

  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. هذا المعرّف مطلوب لأنّه قد يحتوي نشاط أو جزء على أكثر من قائمة واحدة مميّزة وقابلة للتحديد، ويجب الاحتفاظ بجميع هذه القوائم في حالتها المحفوظة.

مراجع إضافية

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