2012-07-11 14 views
52

के साथ सूचीदृश्य पंक्ति पर क्लिक नहीं कर सकता मुझे सूचीदृश्य में समस्या है। इसकी वस्तुओं (पंक्तियों) में छवि बटन है। imagebutton में "android: onClick" है, इसलिए यह ऑनक्लिक ईवेंट काम कर रहा है, लेकिन पंक्ति पर क्लिक करें काम नहीं करता है। अगर मैं पंक्ति वस्तु से छविबटन हटा देता हूं, तो पंक्ति कार्यों पर क्लिक करें (सूचीदृश्य में सही ऑनक्लिक सूचीकार है)। मेरे द्वारा यह कैसे किया जा सकता है ? मैं ऑनक्लिक ईवेंट जरूरत ImageButton और standart क्लिक करें घटना है, जब उपयोगकर्ता का चयन पंक्ति पर उपयोगकर्ता क्लिक (ImageButton क्लिक नहीं लेकिन क्लिक पंक्ति) जबimagebutton

मेरी सूचीदृश्य:

<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/restaurants_list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:divider="@color/list_devider" 
     android:dividerHeight="1dp" 
     android:cacheColorHint="@color/list_background" /> 

उत्तर

170

दुर्भाग्य से,

android:focusable="false" 
android:focusableInTouchMode="false" 

ImageButton के लिए काम नहीं करता।

मुझे अंत में समाधान here मिला। उन वस्तुओं के लिए अपने लेआउट xml में,

android:descendantFocusability="blocksDescendants" 

रूट व्यू में जोड़ें।

यह ListView के लिए पूरी तरह से काम करता है जिसमें ImageButton एस है। official reference के अनुसार, blocksDescendants का अर्थ है कि ViewGroup अपने वंशजों को ध्यान केंद्रित करने से रोक देगा।

+9

'टॉगलबटन' 'एंड्रॉइड के लिए: फोकस करने योग्य =" झूठा "' पर्याप्त है, लेकिन केवल एक छवि बटन के लिए 'एंड्रॉइड: अवरोधक फोकसबिलिटी = "ब्लॉक डिस्केन्डेंट्स" काम करेगा। –

+0

मैंने इस कोड को मेरी सूची आइटम के मूल दृश्य में जोड़ा और यह काम करता है! मैं बिना किसी समस्या के लिस्टव्यू और इमेजबटन पर क्लिक कर सकता हूं। धन्यवाद –

6

तो ListView की एक पंक्ति किसी भी क्लिक करने योग्य है तत्व Button, Image ..etc..then onItemClick काम नहीं करेगा। इसलिए आपको अपनी सूची एडाप्टर के getView में क्लिक श्रोता लिखना होगा।

अधिक पढ़ने के लिए this

8

आप अपनी सूची के लिए कस्टम एडाप्टर का उपयोग कर सकते हैं (यदि आपने पहले से नहीं किया है)। और वहाँ, एडाप्टर के getView(int position, View inView, ViewGroup parent) विधि में कुछ इस तरह करते हैं:

@Override 
public View getView(int position, View inView, ViewGroup parent) { 

    View v = inView; 
    ViewHolder viewHolder; //Use a viewholder for sufficent use of the listview 

    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) adaptersContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.list_item, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.image = (ImageView) v.findViewById(R.id.ImageView); 
     v.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) v.getTag(); 
    } 

     ..... 

    viewHolder.image.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      //Click on imageView 
     }i 
    }); 

    v.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      //Click on listView row 
     } 
    }); 

     ..... 

    return (v); 
} 

here देखने के लिए कि आप अपने कस्टम एडाप्टर बनाने के लिए मदद की जरूरत है।

+0

ध्यान रखें कि यह समाधान पंक्ति को स्वयं ही चुनने से रोकता है। कुछ मामलों में, आप एक सूचीदृश्य चाहते हैं जहां आप एक पंक्ति का चयन कर सकते हैं और एक पंक्ति के भीतर एक बटन पर क्लिक कर सकते हैं। – AndroidDev

+0

क्या प्रत्येक अनुरोधित दृश्य के लिए एक नया श्रोता बनाने के लिए वांछनीय है? – Maarten

+0

@Marten यदि वांछनीय द्वारा आप कुशल हैं, तो यह 'व्यूहोल्डर' तकनीक का उपयोग करने के बाद से प्रभावी है, 'ListView' केवल पंक्तियों की आवश्यकता है, न कि पंक्तियों की आवश्यकता है। – Angelo

2

अपने बटन के लिए इन गुणों को सेट करें:

 android:focusable="false" 
     android:focusableInTouchMode="false" 

या आप यह गतिशील सेट कर सकते हैं अपने एडाप्टर कक्षा में:

 yourButton.setFocusable(false); 
    yourButton.setFocusableInTouchMode(false); 

और सुनिश्चित करें कि आप सूचीदृश्य के लिए एकल के रूप में पसंद मोड सेट है कि :

 listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
+0

यह काम नहीं करता है। क्या आपने इसे सत्यापित किया है? – z5h

+0

यह मेरे लिए काम करता है, आप क्यों कहते हैं कि यह काम नहीं कर रहा है? मेरे पास एक चेकबॉक्स, एक और सामान और बटन के साथ एक पंक्ति है। पंक्ति का चयन किया जा सकता है, और बटन और चेकबॉक्स भी। – David

+0

हालांकि, यह वास्तव में अजीब है कि एंड्रॉइड: फोकस करने योग्य = "झूठा" ImageButton के लिए काम नहीं करता है। – Eliko

1

यदि किसी पंक्ति में कई क्लिक करने योग्य तत्व हैं, तो ItemClick() काम नहीं करेगा। आपको getView() विधि में OnClickListener सेट करने की आवश्यकता होगी। श्रोताओं को दृश्य का टैग स्टोर करें ताकि उन्हें पुनर्नवीनीकरण किया जा सके, अपने श्रोताओं को विधियां जोड़ें ताकि वे विभिन्न पंक्तियों के लिए विशिष्ट हो सकें।

 @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
     View view = super.getView(position, convertView, parent); 

     RowClickListeners listeners = (RowClickListeners) view.getTag(); 
     if (listeners == null) { 
      listeners = new RowClickListeners(); 
     } 

     // Row click listener: 
     RowClickListener onClickListener = listeners.rowClickListener; 
     if (onClickListener == null) { 
      onClickListener = new RowClickListener(); 
      listeners.rowClickListener = onClickListener; 
     } 
        onClickListener.setToPosition(pos); 
     view.setOnClickListener(onClickListener); 

     // Overflow listener: 
     View btn = view.findViewById(R.id.ic_row_btn); 
     ButtonListener btnListener = listeners.buttonClickListener; 
     if (rowListener == null) { 
      btnListener = new ButtonListener(activity); 
      listeners.rowClickListener = btnListener; 
     } 
        btnListener.setToPosition(pos); 
     btnListener.setCollection(collectionId); 
     btn.setOnClickListener(btnListener); 
    } 


    public static class RowClickListeners { 
     public RowClickListener rowClickListener; 
     public ButtonListener buttonClickListener; 
    } 
1

मेरे मामले में, मुख्य परत के लिए android:descendantFocusability="blocksDescendants" काम नहीं किया, न ही सूची दृश्य में। मैंने android:focusable="false" android:focusableInTouchMode="false" भी कोशिश की जो मैंने सुना है कि यह बटन के लिए काम कर रहा है, लेकिन मेरे पास छविबटन था इसलिए ऐसा नहीं हुआ।

लेकिन लेआउट के सीएस फ़ाइल में बटन के गुणों को सेट करने के लिए काम किया।

var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1); 
imageButton.Focusable = false; 
imageButton.FocusableInTouchMode = false; 
imageButton.Clickable = true; 
+0

मैं अपना खुद का छवि बटन उपयोग कर रहा हूं। अन्य उत्तरों के लिए मेरे लिए काम नहीं किया, लेकिन यह काम करता है। (मैंने उन्हें अपने कस्टम एडाप्टर में इस्तेमाल किया) – Sdghasemi

0

मेरे ऊपर कोई भी उत्तर ऊपर काम नहीं किया, लेकिन एक संयोजन किया।

मैं अब एक्सएमएल और जावा में मैं भी ListView और focusable(false), focusableInTouchMode(false), clickable(true) ImageButtons पर पर descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS) सेट में ImageButtons पर ListView पर android:descendantFocusability="blocksDescendants" और android:focusable="false" android:focusableInTouchMode="false" निर्धारित किया है।