هل هناك عيوب في تنفيذ onClickListener لكل صف ListView بدلاً من onItemClickListener؟

StackOverflow https://stackoverflow.com//questions/9708208

سؤال

سيكون أكثر ملاءمة بالنسبة لي لتسجيل فريدة من نوعها 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)
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top