2011-11-18 19 views
26

मेरे पास एक एडाप्टर से भरा ग्रिडव्यू है जो प्रत्येक में लिनियरलाइट्स को एक छविबटन और टेक्स्ट व्यू देता है।OnItemClickListener एंड्रॉइड ग्रिड व्यू पर ट्रिगर नहीं किया गया

एडाप्टर में मैं छविबटन पर ऑनक्लिक और ऑनलांग क्लिक ईवेंट को बाध्य कर रहा हूं।

मैं ग्रिडव्यू पर OnItemClickListener को बांधने की कोशिश कर रहा हूं, लेकिन मुझे नहीं पता कि ऑन दैटक्लेक्ड कभी नहीं निकाल दिया गया।

यह बिना किसी चीज़ के मेरा 6 वां घंटा है।

वैसे; OnItemSelectListener पूरी तरह से ग्रिड पर काम कर रहा है।

मैं जांच रहा हूं कि कोड का कुछ टुकड़ा गलती से ITemClicked को संभालता है लेकिन अभी तक पकड़ नहीं सकता है।

मुझे मदद लोगों की ज़रूरत है।

gridView = (GridView) layoutInflater.inflate(R.layout.gridview, null); 
gridView.setOnItemClickListener(new ItemClickListener()); 
. 
. 
. 

//inner handler class 
class ItemClickListener implements AdapterView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     Toast.makeText(mainActivity.getApplicationContext(),view + " clicked at pos " +    
     i,Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

वहाँ LogCat में कोई अपवाद नहीं है? –

+1

संख्या। चूंकि मैंने कोई अपवाद नहीं लिया है, इसलिए मैं एप्लिकेशन को क्रैश कर दूंगा। क्या मैं नहीं ?? –

+0

मुझे इस कोड के साथ कुछ भी गलत नहीं दिख रहा है, शायद समस्या कहीं और है। – Caner

उत्तर

73

ग्रिड में क्लिक करने योग्य ऑब्जेक्ट्स का उपयोग न करें। उस स्थिति में एंड्रॉइड GridView के क्लिक ईवेंट को संभाल नहीं सकता है।

इसके बजाय, एक समान उपयोगकर्ता इंटरफ़ेस दृश्य दिखाने के लिए कुछ उपयोग करें। फिर उस ऑब्जेक्ट के क्लिक क्रियाओं को संभाल लें।

मत करो:GridView में Button डाल कुछ क्लिक कार्रवाई करने के लिए।

है:ImageButton के बजाय एक ImageView रख दिया और ImageView के क्लिक के ईवेंट प्रबंधित।

+0

उदाहरण के लिए, 'ग्रिड व्यू' के उप-वर्ग के भीतर एक उपclassed 'एडाप्टर व्यू' में: '@ ओवरराइड सार्वजनिक देखें getView (अंतिम int स्थिति, देखें कन्वर्ट व्यू, व्यू ग्रुप पैरेंट) { छवि दृश्य छवि देखें = नया छवि दृश्य (getContext()); imageView.setOnClickListener (नई OnClickListener() { @Override onClick (देखें v) { अगर (getOnItemClickListener() = नल) { getOnItemClickListener() onItemClick (MyGridView.this, वी, स्थिति, getItemId (स्थिति))!। } वापसी imageView;? } ' – EricRobertBrewer

+0

http://stackoverflow.com/questions/36474607/android-onkeylistener-with-filter-stop-onitemclicklistener-from-dpad आप इस समान queston को देखो कृपया –

3

भी स्थिति में आप क्लिक करने के लिए चाहते हैं के लिए सुनिश्चित कर लें, जो आपके ListAdpter

सार्वजनिक बूलियन IsEnabled (पूर्णांक _position) के लिए सच रिटर्न

1

अरे guyz अंत में मिला एक समाधान ...

है कि हम क्या कर रहे थे सीधे, GridView अंदर लेआउट तक पहुँच रहा है ताकि onItemClickListener यह भ्रामक आइटम तक पहुंचने की पाता है।

तो समाधान एडाप्टर के अंदर onClickListener (अर्थात सामान्य रूप से ArrayAdapter)

तो क्या मैं कहने की कोशिश कर हूँ है लागू करने के लिए है:

public View getView(int position, View convertView, ViewGroup parent) { 

      //Here row is a view and we can set OnClickListener on this 
    final View row; 
    ViewHolder holder = null; 

    if (convertView == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     //Here we inflate the layout to view (linear in my case) 
     row = inflater.inflate(layoutResourceId, parent, false); 
     holder = new ViewHolder(); 
     holder.imageTitle = (TextView) row.findViewById(R.id.text); 
     holder.image = (ImageView) row.findViewById(R.id.image); 
     row.setTag(holder); 
    } else { 
     row = convertView; 
     holder = (ViewHolder) row.getTag(); 
    } 

    ImageItem item = data.get(position); 
    holder.imageTitle.setText(item.getTitle()); 
    holder.image.setImageBitmap(item.getImage()); 

    //Now get the id or whatever needed 
    row.setId(position); 
    // Now set the onClickListener 
    row.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(context, "Clicked" + row.getId() + "!!", 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    return row; 
} 
0

महान यहाँ समाधान लेकिन कोई भी मेरे लिए तय की। तो मैं उस जवाब को साझा करना चाहता था जिसने मुझे यहां मदद की।

https://stackoverflow.com/a/19303427/577269

12

आप उपयोग करना Button या ImageButton तो आप विजेट का अपने xml कोड में इन विशेषताओं लिखने की ज़रूरत चाहता है।

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

यह मेरे लिए काम करता है।

लेकिन ग्रिड व्यू में, इन विगेट्स के उपयोग से बचने के लिए प्रयास करें। आप इनमें से किसी अन्य विजेट का उपयोग कर सकते हैं (ImageView या किसी अन्य की तरह)।

+0

अजीब तरह पर्याप्त, यह काम करता है और फिर भी आप बटन को टैप और ट्रिगर करने देते हैं यदि आप इसके लिए ऑनक्लिकलिस्टर सेट करते हैं, लेकिन अगर आप वांछित के रूप में कहीं और टैप करते हैं तो आपको ग्रिड आइटम पर क्लिक करने देता है। –

+0

मुझे इसे बच्चों और माता-पिता के विचारों के लिए रखना था लेआउट और "गैर-क्ली सहित सीकेबल "विचार। अजीब, है ना? –

+0

महान जवाब। बहुत बहुत एमपीजी धन्यवाद! – richc

0

स्थापित करने के लिए प्रयास करें मैं भी एक ही समस्या से मिलते हैं, क्योंकि कई कारणों से की। तो, यहाँ मेरी युक्तियां दी गई हैं:

  1. अपने एडाप्टर के लिए BaseAdapter बढ़ाएँ; अनुकूलक में
  2. उपयोग OnClickListener getView अंदर बजाय OnItemClickListener की स्थापना के लिए GridView;
  3. लेआउटपार्म कई बार सेट करने से बचें;
  4. जांचें कि स्थिति = 0, कन्वर्ट व्यू का उपयोग न करें, नया फुलाएं देखें;
  5. सेट OnClickListener न केवल माता-पिता देखें के लिए, लेकिन किसी भी बच्चे के लिए देखें, यदि कोई हो;
  6. अपने सभी देखें एस क्लिक करने योग्य।

मैंने अभी इसे 4 उपकरणों पर परीक्षण किया है, और यह समाधान अपेक्षा के अनुसार काम करता है। उम्मीद है, यह आपके मामले में मदद करेगा। मुझे सही करें, अगर मैंने कुछ गलत किया है।

लेआउट कोड एक्सएमएल:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:background="#273238" 
    android:clickable="true" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:padding="1dp"> 

<ImageView 
    android:id="@+id/open_image_item_imageview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:src="@drawable/loh" 
    android:clickable="true" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    android:scaleType="centerCrop"/> 
<TextView 
    android:id="@+id/open_image_item_textview" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:clickable="true" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    android:layout_gravity="bottom" 
    android:padding="4dp" 
    android:textSize="10sp" 
    android:ellipsize="start" 
    android:background="#55000000" 
    android:textColor="#FFFFFF" 
    android:text="image name"/> 

</FrameLayout> 

एडाप्टर कोड जावा:

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if(convertView != null && position != 0) 
      view = convertView; 
     else{ 
      view = LayoutInflater.from(getContext()).inflate(R.layout.open_image_item_layout, null, false); 
      view.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, size)); 
     } 

     TextView textView = (TextView)view.findViewById(R.id.open_image_item_textview); 
     ImageView imageView = (ImageView)view.findViewById(R.id.open_image_item_imageview); 

     ... 

     View.OnClickListener onClickListener = getOnClickListener(files[position]); 
     view.setOnClickListener(onClickListener); 
     textView.setOnClickListener(onClickListener); 
     imageView.setOnClickListener(onClickListener); 

     return view; 
    } 
संबंधित मुद्दे