هل هناك عيوب في تنفيذ onClickListener لكل صف ListView بدلاً من onItemClickListener؟
-
14-12-2019 - |
سؤال
سيكون أكثر ملاءمة بالنسبة لي لتسجيل فريدة من نوعها OnClickListener
لكل صف في ListView
, ولكنني أريد التأكد من أن هذه ممارسة مقبولة.لي التصميم الحالي هي طريقة معقدة إلى حد ما للفصل بين اهتمامات OnClickListener
من كل نوع صف
والسبب في ذلك هو أن لدي فئات متعددة من الصفوف في ملف ListView
.كل فئة لديها مسؤولية وسلوك مختلف تماما.على سبيل المثال، اعتبر أ ListView
يمكن أن تحتوي على فئات فرعية وعناوين كتب.إذا تم النقر على عنوان الكتاب، فيجب أن يبدأ نشاط جديد يعرض صورة الغلاف.إذا تم النقر على فئة فرعية، يتم عرض قائمة جديدة من الكتب والفئات.
أرغب في أن يحافظ الصف نفسه على المعرفة حول هويته ومسؤوليته بدلاً من الاضطرار إلى تسريب المعرفة حول كل صف ليتم الحفاظ عليها بواسطة منفذ onItemClickListener
.
أود أيضًا أن أعرف ما هي الآثار المترتبة على الأداء عند القيام بذلك مقابل القيام بذلك.تنفيذ المنطق الخاص بي لمعرفة كيفية التعامل مع النقرة.
هل هناك عيوب في التنفيذ onClickListener
لكل ListView
ArrayAdapter
صف بدلا من onItemClickListener
؟أبحث عن بيانات ملموسة و عيوب محددة بدلاً من التوصيات الغامضة.
هل يجب أن أتوقع استخدام الذاكرة, وقت التهيئة, ، أو سرعة الحالة المستقرة (مثل التمرير خلال القائمة) لتتأثر بشكل كبير؟
المحلول
لا تشرح سبب حاجتك إلى مستمعي نقرات منفصلين لكل صف، لكنني أوصي بعدم القيام بذلك.نلقي نظرة على استخدام View.setTag(Object)
/View.getTag()
لتمرير بيانات مخصصة خاصة بالصف يمكنك من خلالها تخصيص استجابة مستمع النقر (المشترك).
يحرر
أرى من المثال الخاص بك لماذا تريد مختلفة OnClickListener
تعلق على صفوفك.لقد كنت أعتقد أنك تريد الانفصال OnClickListener
مثيل لكل صف.(كان هذا هو السبب الرئيسي للتوصية بعدم القيام بذلك.) إذا كان لديك نوعان من الصفوف (الفئات والعناوين) ومئات الصفوف، فستحتاج فقط إلى نوعين من الاستجابات، وليس مئات منها.أنا أفهم أيضًا النقطة المتعلقة بفصل المخاوف.
ومع ذلك، أعتقد أن الغالب ListActivity.onListItemClick()
(أو الاتصال ListView.setOnItemClickListener()
إذا كنت لا تستخدم ListActivity
) سيكون أكثر نظافة وأقل احتمالاً للتداخل مع تشغيل عرض القائمة.يمكنك استخدام نمط المفوض لهذا، على النحو التالي.
تحديد فئة أو واجهة مجردة:
public interface MyClickHandler {
public void onItemClick(ListView l, View v, int position, long id);
}
ثم قم بإنشاء مثيل واحد لكائن يقوم بتنفيذ هذه الواجهة لكل كائن يكتب من بيانات الصف (وليس مثيل واحد لكل صف).في المحول الخاص بك، استخدم setTag(Object)
لتهيئة العلامة لكل صف إلى المكان المناسب MyClickHander
مثال.في الخاص بك ListActivity.onListItemClick()
تجاوز، استخدم هذا المنطق:
protected void onListItemClick(ListView l, View v, int position, long id) {
Object tag = v.getTag();
if (tag instanceof MyClickHandler) {
((MyClickHandler) tag).onItemClick(l, v, position, id);
} else {
// default processing (if any)
}
}