2010-08-20 10 views
53

तो, मैं इस वीडियो को देख रहा हूं http://www.youtube.com/watch?v=N6YdwzAvwOA और रोमेन गाय दिखा रहा है कि getView() विधि का उपयोग करके अधिक कुशल UI एडाप्टर कोड कैसे बनाएं। क्या यह कर्सर एडाप्टर पर भी लागू होता है? मैं वर्तमान में अपने कस्टम कर्सर एडेप्टर के लिए bindView() और newView() का उपयोग कर रहा हूं। क्या मुझे इसके बजाय getView का उपयोग करना चाहिए?GetView बनाम। एक कस्टम कर्सर एडाप्टर में BindView?

उत्तर

72

CursorAdaptergetView() का कार्यान्वयन और इस तरह से newView() और bindView(), प्रतिनिधियों पंक्ति रीसाइक्लिंग पैटर्न लागू करता है के रूप में है। इसलिए, यदि आप newView() और bindView() ओवरराइड कर रहे हैं तो आपको पंक्ति रीसाइक्लिंग के लिए CursorAdapter के साथ कुछ भी विशेष करने की आवश्यकता नहीं है।

+6

मैं व्यूहोल्डर पैटर्न कैसे लागू करूं? क्या मैं इसे newView() और bindView() के बीच विभाजित करूंगा? –

+17

@Scienceprodigy: 'newView() 'में, आप पंक्ति के लिए' ViewHolder' बनायेंगे और इसे 'setTag()' से संबद्ध करेंगे। 'BindView() 'में, आप' GetHager '' के माध्यम से' ViewHolder' पुनर्प्राप्त करेंगे। – CommonsWare

+0

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

18
/** 
    * @see android.widget.ListAdapter#getView(int, View, ViewGroup) 
    */ 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (!mDataValid) { 
      throw new IllegalStateException("this should only be called when the cursor is valid"); 
     } 
     if (!mCursor.moveToPosition(position)) { 
      throw new IllegalStateException("couldn't move cursor to position " + position); 
     } 
     View v; 
     if (convertView == null) { 
      v = newView(mContext, mCursor, parent); 
     } else { 
      v = convertView; 
     } 
     bindView(v, mContext, mCursor); 
     return v; 
    } 

यह कर्सर एडाप्टर स्रोत कोड, स्पष्ट रूप से कर्सर एडाप्टर अधिक काम करता है।

2

CursorAdapter कार्यान्वयन BaseAdapter की तरह उप-classing नियमित एडेप्टर से अलग है, आप ओवरराइड करने के लिए getView(), getCount(), getItemId() क्योंकि उस जानकारी कर्सर से ही प्राप्त किया जा सकता है की जरूरत नहीं है।

एक Cursor को देखते हुए, आप केवल एक CursorAdapter उपवर्ग बनाने के लिए दो तरीकों ओवरराइड करने के लिए की जरूरत है:, लेकिन इस विचार को देखते हुए प्रदान की कर्सर में डेटा प्रदर्शित करने के लिए अद्यतन:

bindView()

newView(): इसे सूची में जाने वाले एक नए दृश्य को तैयार करने के लिए कहा जाता है।

CursorAdapter रीसाइक्लिंग विचारों का ख्याल रखेगा (getView() नियमित Adapter पर विधि के विपरीत)। यह प्रत्येक बार एक नई पंक्ति की आवश्यकता होने पर newView() पर कॉल नहीं करता है। यदि उसके पास पहले से View है (null नहीं), तो यह सीधे bindView() पर कॉल करेगा, इस तरह, निर्मित दृश्य का पुन: उपयोग किया जाता है। इन दो तरीकों से प्रत्येक दृश्य की सृजन और आबादी को विभाजित करके, CursorAdapter नियमित रूप से एडाप्टर में, जहां इन दोनों चीजें getView() विधि में की गई हैं, पुन: उपयोग को प्राप्त करती है।

+2

धन्यवाद, बहुत उपयोगी। – LarsH

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