2009-04-10 19 views
11

में ग्रिड व्यू में एक क्लिक करने योग्य छवि बनाएं, मेरे पास this tutorial में ग्रिड व्यू में प्रदर्शित छवियां हैं। मैं एक छवि पर क्लिक करने और अन्य घटनाओं को करने में सक्षम होना चाहता हूं और मुझे यह जानने की ज़रूरत है कि कौन सी छवि पर क्लिक किया गया था।एंड्रॉइड

क्या मुझे ImageAdapter क्लास में imageView.onKeyDown (keyCode, ईवेंट) जोड़ना है? कोड वर्तमान में मौजूद है:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
    // if it's not recycled, initialize some attributes 
    imageView = new ImageView(mContext); 
    imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setPadding(8, 8, 8, 8); 
    //does this need imageView.onKeyDown(keyCode, event)? 
    } 
    else { 
    imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 

यह कैसे इंगित करेगा कि छवि पर क्लिक किया गया था? मैं उचित हैंडलर कैसे बना सकता हूं?

उत्तर

24

एक GridView के लिए आप एक OnItemClickListener श्रोता के लिए setOnItemClickListener विधि का उपयोग कर सकते हैं। यही कारण है कि श्रोता आप एक विधि है कि आप हस्ताक्षर

onItemClick(AdapterView<?> parent, View v, int position, long id) 

जहां ग्रिड क्लिक किए गए में आइटम की स्थिति और देखें ग्रिड के सेल के अंदर है कि मिल के साथ ओवरराइड चाहिए दे देंगे। क्या आपको इसकी आवश्यकता है?

+0

इस दृष्टिकोण के लिए अधिक विस्तृत कोड के लिए [जियानहोंग का उत्तर] (http://stackoverflow.com/a/5789159/199364) देखें। – ToolmakerSteve

6

मैं स्थिति को अंतिम करके और छवि दृश्य पर ऑनक्लिक श्रोता जोड़कर क्लिक की गई छवि की स्थिति प्राप्त करने में सक्षम था। यह उस छवि की स्थिति को लॉग करता है जिसे क्लिक किया गया था।

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
    // if it's not recycled, initialize some attributes 
    imageView = new ImageView(mContext); 
    imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setPadding(8, 8, 8, 8); 


    imageView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View view) { 
     Log.d("onClick","position ["+position+"]"); 
     } 

    }); 

    } 
    else { 
    imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 
+3

इस तरह से आप चीजों को क्या करना चाहते हैं नहीं है। इसके बजाय Alejandros विधि का उपयोग करें। यह बहुत साफ है और इसमें विधियों के हस्ताक्षर को बदलने में शामिल नहीं है। –

+0

इसके बजाय, [जियानहोंग का उत्तर] देखें (http://stackoverflow.com/a/5789159/199364), जो अलेजांद्रो द्वारा वर्णित ग्रिडव्यू.सेटऑनआईटिमक्लिक लिस्टनर का उपयोग करने के लिए कोड दिखाता है। (और इस उत्तर में समाधान का उपयोग करने का प्रयास करते समय एक बग का उल्लेख करता है।) – ToolmakerSteve

6

मैंने उपर्युक्त विधि getView (अंतिम int स्थिति ...) को एहसास किया कि 28 आइटम के बाद स्थिति "रीसेट" हो गई है और ग्रिडव्यू में 28 वें आइटम के बाद स्थिति 0 पर वापस आ गई है।

मुझे संदेह है कि अंतिम कीवर्ड समस्या पैदा कर रहा है और इसे हटाने के बाद मैं उम्मीदों के अनुसार पद प्राप्त करने में सक्षम था।

नीचे एक नमूना कोड है जिसमें क्लिक ईवेंट को ग्रिडव्यू प्रदर्शित करने वाली गतिविधि में बुलाया जा रहा है।

public class MainActivity extends Activity { 

ArrayList<Integer> item_ids = new ArrayList<Integer>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    item_ids = //get your item ids method 

    GridView gridview = (GridView) findViewById(R.id.grid_featured); 
    gridview.setAdapter(new ImageAdapter(this)); 
    gridview.setOnItemClickListener(itemClickListener); 

    footer = (Footer)findViewById(R.id.layoutFooter); 
    footer.setActivity(this); 
} 

private OnItemClickListener itemClickListener = new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
    Log.d(TAG,"Position Clicked ["+position+"] with item id ["+item_ids.get(position)+"]"); 
    } 
}; 

}