شرح - Android ListView مع تخطيطات مختلفة لكل صف




listview in listview android (4)

أعرف كيفية إنشاء محول صف صف مخصص + مخصص لدعم صف مخصص لعرض القائمة بالكامل. ولكن كيف يمكن لواحد من listview دعم العديد من أنماط الصفوف المختلفة؟

أنت تعرف بالفعل الأساسيات. تحتاج فقط إلى الحصول على محول مخصص لعرض تخطيط / عرض مختلف استنادًا إلى معلومات الصف / المؤشر التي يتم توفيرها.

يمكن لـ ListView دعم أنماط صف متعددة لأنه مشتق من AdapterView :

يعد AdapterViewView طريقة عرض يتم تحديد أطفالهم بواسطة مهايئ.

إذا نظرت إلى Adapter ، فستشاهد طرقًا تستخدم حساب طرق عرض خاصة بالصف:

abstract int getViewTypeCount()
// Returns the number of types of Views that will be created ...

abstract int getItemViewType(int position)
// Get the type of View that will be created ...

abstract View getView(int position, View convertView, ViewGroup parent)
// Get a View that displays the data ...

تقدم الطريقتان الأخيرتان الموضع بحيث يمكنك استخدام ذلك لتحديد نوع العرض الذي يجب أن تستخدمه لهذا الصف .

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

على سبيل المثال ، لاستخدام ArrayAdapter ،

  • تجاوز getView() لتضخيم ، ملء ، وإرجاع العرض المطلوب لموقف معين. تتضمن طريقة getView() فرصة لإعادة استخدام المشاهدات عبر المعلمة convertView .

ولكن لاستخدام مشتقات CursorAdapter ،

  • تجاوز newView() لتضخيم newView() وإرجاع العرض المرغوب لحالة المؤشر الحالية (أي "الصف" الحالي) [تحتاج أيضًا إلى تجاوز bindView حتى تتمكن الأداة من إعادة استخدام المشاهدات]

ومع ذلك ، لاستخدام SimpleCursorAdapter ،

  • تعريف SimpleCursorAdapter.ViewBinder مع أسلوب setViewValue() لتضخيم ، setViewValue() ، وإرجاع العرض المطلوب لصف معين (الدولة المؤشر الحالية) و "عمود" البيانات. يمكن أن تحدد الطريقة فقط وجهات النظر "الخاصة" وتؤجل السلوك القياسي ل SimpleCursorAdapter لربط "طبيعي".

ابحث عن الأمثلة / البرامج التعليمية المحددة لنوع المحول الذي تستخدمه في النهاية.

أحاول تحديد أفضل طريقة للحصول على ListView واحد يحتوي على تخطيطات مختلفة لكل صف. أعرف كيفية إنشاء محول صف صف مخصص + مخصص لدعم صف مخصص لعرض القائمة بالكامل ، ولكن كيف يمكنني تنفيذ العديد من أنماط الصفوف المختلفة في ListView؟


إذا احتجنا إلى إظهار نوع عرض مختلف في عرض القائمة ، فمن الجيد استخدام getViewTypeCount () و getItemViewType () في المهايئ بدلاً من تبديل العرض. VIEW.GONE و VIEW.VISIBLE يمكن أن تكون مهمة مكلفة جدًا داخل getView () والتي يؤثر على قائمة التمرير.

الرجاء التحقق من هذا واحد لاستخدام getViewTypeCount () و getItemViewType () في محول.

الرابط: the-use-of-getviewtypecount


في محول الصفيف المخصص الخاص بك ، يمكنك تجاوز أسلوب getView () ، كما هو معتاد على دراية. ثم كل ما عليك فعله هو استخدام عبارة switch أو عبارة if لإرجاع عرض مخصص معين بناءً على وسيطة الموضع التي تم تمريرها إلى أسلوب getView. إن Android ذكي في أنه سيعطيك فقط ميزة convertView من النوع المناسب لموضعك / صفك ؛ لا تحتاج إلى التحقق من أنها من النوع الصحيح. يمكنك مساعدة Android في ذلك عن طريق تجاوز getItemViewType () وطرق getViewTypeCount () بشكل مناسب.


كان ListView مخصصًا لحالات الاستخدام البسيط مثل العرض الثابت نفسه لجميع عناصر الصفوف.
نظرًا لأنك تحتاج إلى إنشاء ViewHolders واستخدام كبير لـ getItemViewType() وعرض ديناميكيًا مختلفًا لصف xml الخاص بتخطيط الصفوف ، يجب أن تحاول القيام بذلك باستخدام RecyclerView ، والذي يتوفر في واجهة برمجة تطبيقات Android 22. يوفر دعمًا وبنية أفضل للعرض المتعدد أنواع.

تحقق من هذا tutorial حول كيفية استخدام RecyclerView للقيام بما تبحث عنه.





listviewitem