2010-04-01 11 views
14

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

वास्तविक कोड इस तरह है:

public class MyAdapterView extends AdapterView<ImageAdapter> implements AdapterView.OnItemClickListener{ 
    private ImageAdapter mAdapter; 
    public MyAdapterView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initThings(); 
    } 
    private void initThings(){ 
     setOnItemClickListener(this); 
    } 
    @Override 
    public ImageAdapter getAdapter() { 
     // TODO Auto-generated method stub 
     return mAdapter; 
    } 
    @Override 
    public void setAdapter(ImageAdapter adapter) { 
     // TODO Auto-generated method stub 
     mAdapter=adapter; 
     requestLayout(); 
    } 
    View obtainView(int position) { 
     View child = mAdapter.getView(position, null, this); 
     return child; 
    } 
    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
     for(int i=0;i<mAdapter.getCount();i++){ 
      View child = obtainView(i); 
      child.layout(10, 70*i, 70, 70); 
      addViewInLayout(child, i, null, true); 
     } 
     this.invalidate(); 
    } 
    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
     Log.d("MYEXAMPLES","Clicked an item!"); 
    } 
} 

यह एक कोडिंग कृति नहीं है, यह सिर्फ चित्रों के साथ एक छद्म सूचीदृश्य प्रदर्शित करता है। मुझे पता है कि मैं ListView, GridView, Spinner, आदि का उपयोग कर सकता था लेकिन मैं एंड्रॉइड के लिए नया सापेक्ष हूं और मैं इस पर कुछ चीजों को समझने की कोशिश कर रहा हूं।

ठीक है, सवाल यह है: मेरा पर itemClick फ़ायरिंग क्यों नहीं है?

एक ग्रिड व्यू के साथ एक ही छवि एडाप्टर का उपयोग करके, सब कुछ ठीक काम करता है, लेकिन जब मैं उपरोक्त वर्ग के साथ उपयोग करता हूं, तो मुझे कुछ भी नहीं मिलता है। अंदर एडाप्टर व्यू.जावा उन क्लिक, लांगक्लिक इत्यादि के लिए कोड है ... तो मैं उन्हें क्यों नहीं फेंक सकता? शायद मैं एडाप्टर व्यू कैसे काम करता है इस बारे में बुनियादी चीजों को गलत समझ रहा हूं? क्या मुझे इसके बजाय अन्य आधार वर्गों का विस्तार करना चाहिए? और क्यों?

यहां पर अधिक अनुभवी मार्गदर्शन खोजने की उम्मीद है, अग्रिम धन्यवाद।

+0

क्या आपको समाधान मिल गया है ?? – Riser

उत्तर

0

एडाप्टर व्यू को विस्तारित करने के बजाय, आप बेस एडाप्टर के साथ क्यों प्रयास नहीं करते हैं। जब आप अपने एडाप्टर को महंगी करते हैं, तो नीचे दी गई ओन विधि होती है।

getView(int position, View convertView,ViewGroup group) 

उपरोक्त विधि में आप सूचीदृश्य की प्रत्येक सूची आइटम के लिए लेआउट का उपयोग कर सकते हैं और यहाँ आप प्रत्येक नियंत्रण के लिए सभी समर्थित घटनाओं सेट कर सकते हैं।

+1

मुझे पता था कि एडाप्टर पर प्रत्येक दृश्य के लिए अपने स्वयं के ऑनक्लिक श्रोताओं को डालने के बारे में पता था, लेकिन क्या यह स्वीकार्य है? मैं भी कर सकता है कि मेरी कक्षा "addViewInLayout" ... के बाद हर बच्चे के लिए onClickListeners जोड़ने लेकिन मैंने सोचा था एडाप्टर केवल "आइटम" का प्रबंधन करना चाहिए और दृश्य (AdapterView) की स्थिति, घटनाओं का प्रबंधन करना चाहिए, और इतने पर अंदर। .. वही ListView/GridView करता है ... उनका पदानुक्रम AdapterView-> AbsListView-> ListView से जाता है, इसलिए मैंने सोचा कि मैं कुछ ऐसा कर सकता हूं लेकिन यह काम नहीं करता है ... –

0

मैं कुछ इसी तरह के साथ खेल रहा हूं और मैं इटिम * पर उपयोग कर रहा हूं चयनित * श्रोता जो आप खोज रहे हैं उतना अधिक हो सकता है।

3

आप AdapterView के स्रोतों में एक बार देख ले, तो आप उस OnItemClickListener एक विधि में लागू किया जाता है देखेंगे, performItemClick कहा जाता है:

public boolean performItemClick(View view, int position, long id) { 
    if (mOnItemClickListener != null) { 
     // ... 
     mOnItemClickListener.onItemClick(this, view, position, id); 
     return true; 
    } 
    return false; 
} 

हालांकि, अगर आप जहां इस विधि के लिए AdapterView स्रोत खोज प्रयोग किया जाता है, आप देखेंगे कि इसे कहीं भी नहीं कहा जाता है!

वास्तव में, अगर आप उदाहरण के लिए Gallery के स्रोत की जाँच करें, आप देखेंगे कि performItemClickonSingleTapUp या onKeyUp घटनाओं से निपटने के भीतर कहा जाता है।

आपको लगता है कि का उपयोग करना चाहते हैं, तो आप एक उपयोगकर्ता कहीं क्लिक करता है का पता लगाने और अपने दम पर performItemClick कॉल करनी होगी।

संबंधित मुद्दे