2012-04-12 14 views
87

मेरे प्रश्न हैं:अपना स्वयं का कस्टम एडाप्टर बनाते समय getView() विधि कैसे काम करती है?

  1. लेआउटइनफ्लेटर का बिल्कुल सही कार्य क्या है?
  2. मेरे द्वारा पढ़े गए सभी लेख क्यों जांचते हैं कि कन्वर्टव्यू शून्य है या नहीं? इसका मतलब क्या है जब यह शून्य है और इसका मतलब क्या नहीं है?
  3. इस विधि को स्वीकार करने वाले पैरेंट पैरामीटर क्या है?

उत्तर

103

1: LayoutInflater अपना लेआउट एक्सएमएल-फाइल लेता है और इसकी सामग्री से विभिन्न व्यू-ऑब्जेक्ट बनाता है।

2: एडेप्टर दृश्यों का पुन: उपयोग करने के लिए बनाए जाते हैं, जब एक दृश्य स्क्रॉल किया जाता है, जो अब दिखाई नहीं दे रहा है, इसका उपयोग नए दृश्यों में से एक के लिए किया जा सकता है। यह पुन: उपयोग किया गया दृश्य convertView है। यदि यह शून्य है तो इसका मतलब है कि कोई पुनर्नवीनीकरण दृश्य नहीं है और हमें एक नया निर्माण करना है, अन्यथा हमें इसे नया बनाने से बचने के लिए इसका उपयोग करना चाहिए।

3: parent प्रदान किया गया है ताकि आप उचित लेआउट पैरामीटर के लिए उसमें अपना विचार बढ़ा सकें।

इन सभी को एक साथ प्रभावी ढंग से (जो एक एडाप्टर लेता है या अन्य दृश्य) का मानना ​​है कि अपनी सूची में दिखाई देगा बनाने के लिए इस्तेमाल किया जा सकता है:,

public View getView (int position, View convertView, ViewGroup parent){ 
    if(convertView == null){ 
     //We must create a View: 
     convertView = inflater.inflate(R.layout.my_list_item, parent, false); 
    } 
    //Here we can do changes to the convertView, such as set a text on a TextView 
    //or an image on an ImageView. 
    return convertView; 
} 

सूचना LayoutInflater के उपयोग कि parent इस्तेमाल किया जा सकता इसके लिए एक तर्क के रूप में, और कैसे convertView पुन: उपयोग किया जाता है। एडाप्टर में

+4

कनवर्टव्यू == नल उपयोगी है जब आपके सभी इन्सेंस एक ही लेआउट का पालन करते हैं। जब आपको उदाहरण के लिए रेडियो या चेक बटन की जांच करने की आवश्यकता होती है, और प्रत्येक आइटम के आधार पर लेआउट बदलें, तो आपको फिर से भरना होगा, या कैश किए गए दृश्य को प्राप्त करना होगा। – sagits

+0

कोई भी आवश्यकता नहीं है। बस आपको स्विच लिखने की आवश्यकता है या अगर अन्य सीढ़ी गेटव्यू में है और आपके मामले के अनुसार विचारों को बढ़ाती है, तो सार्वजनिक int getItemViewType (int position) और public int getViewTypeCount() को ओवरराइड करें। @sagits –

+0

यदि कथन आम तौर पर काम करते हैं, लेकिन रेडियो बटनों का उपयोग करते समय, ग्रंथों को संपादित करते हैं और कैश किए गए विचारों का उपयोग करके परेशानी में इन तरह की चीजें चलाती हैं, तो स्टैक ओवरफ़्लो पर इस सामान के बारे में कुछ प्रश्न हैं। – sagits

9

आप इस वीडियो को सूची दृश्य के बारे में देख सकते हैं। पिछले वर्षों से Google आईओ और अभी भी मेरे दिमाग में सूची दृश्यों पर सबसे अच्छा चलना है।

http://www.youtube.com/watch?v=wDBM6wVEO70

  1. यह (अपने res/लेआउट/फ़ोल्डर पर xml फ़ाइलें) लेआउट अनावश्यक रूप से बढ़ा जावा में LinearLayout और अन्य विचारों के रूप में इस तरह की वस्तुओं।

  2. वीडियो देखें, कन्वर्ट व्यू के उपयोग के साथ आपको अद्यतित कर देगा, मूल रूप से यह एक पुनर्नवीनीकरण दृश्य है जो आपके द्वारा पुन: उपयोग करने का इंतजार कर रहा है, ताकि एक नई वस्तु बनाने से बचें और आपके स्क्रॉलिंग को धीमा कर दिया जा सके। सूची।

  3. आपको एडाप्टर से सूची-दृश्य का संदर्भ देने की अनुमति देता है।

4
  1. लेआउट inflator अनावश्यक रूप से बढ़ा/अपने वर्तमान दृश्य के लिए बाहरी एक्सएमएल कहते हैं।

  2. getView() स्क्रॉल किए जाने सहित कई बार बुलाया जाता है। तो अगर यह पहले से ही फुलाया गया है तो हम इसे फिर से नहीं करना चाहते हैं क्योंकि एक महंगा प्रक्रिया है .. यही कारण है कि हम इसकी जांच करते हैं और फिर इसे फुलाते हैं।

  3. जनक दृश्य अपने सूची की एकल कोशिका है ..

+3

अभिभावक दृश्य गलत तरीके से समझाया गया है। यह सूची दृश्य नहीं होगा ListItem –

2

LayoutInflaterListView आइटम के लिए या टुकड़ा के onCreateView में XML के गतिशील विचारों को उत्पन्न करने के लिए किया जाता है।

ConvertView मूल रूप से उन विचारों को रीसायकल करने के लिए उपयोग किया जाता है जो वर्तमान में दृश्य में नहीं हैं। मान लें कि आपके पास स्क्रोल करने योग्य ListView है। नीचे या ऊपर स्क्रॉल करने पर, convertView उस दृश्य को देता है जो स्क्रॉल किया गया था। यह पुन: स्मृति स्मृति बचाता है।

getView() विधि का मूल पैरामीटर पैरेंट लेआउट का संदर्भ देता है जिसमें सूची दृश्य है। आप माता-पिता एक्सएमएल में किसी भी आइटम आप उपयोग कर सकते क्रमांक प्राप्त करना चाहते हैं कहते हैं:

ViewParent nv = parent.getParent(); 

while (nv != null) { 

    if (View.class.isInstance(nv)) { 
     final View button = ((View) nv).findViewById(R.id.remove); 
     if (button != null) { 
      // FOUND IT! 
      // do something, then break; 
      button.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        Log.d("Remove", "Remove clicked"); 

        ((Button) button).setText("Hi"); 
       } 
      }); 
     } 
     break; 
    } 

} 
1

getView() विधि नया बनाने View या Listview या स्पिनर की प्रत्येक पंक्ति के लिए ViewGroupres/layout फ़ोल्डर में Layout XML फ़ाइल में View या ViewGroup को परिभाषित कर सकते हैं और संदर्भ Adapter क्लास ऑब्जेक्ट को संदर्भित कर सकते हैं।

यदि आपके पास एडे में 4 आइटम एडाप्टर को पास किया गया है।getView() विधि एडपेर की 4 पंक्तियों के लिए 4 व्यू तैयार करेगी।

लेआउट इन्फ्लूटर क्लास में एक विधि inflate() है जो एक्सएमएल संसाधन लेआउट से ऑब्जेक्ट देखें।

61

getView() विधि एक ListView, Gallery के आइटम का दृष्टिकोण पैदा करने के लिए है ...

  1. LayoutInflater देखें वस्तु है जो आप एक लेआउट एक्सएमएल (रूट वस्तु में परिभाषित प्राप्त करने के लिए प्रयोग किया जाता है , आम तौर पर एक LinearLayout, FrameLayout, या RelativeLayout)

  2. convertView रीसाइक्लिंग के लिए है। आइए मान लें कि आपके पास एक सूचीदृश्य है जो एक समय में केवल 10 आइटम प्रदर्शित कर सकता है, और वर्तमान में यह आइटम 1 -> आइटम 10 प्रदर्शित करता है। जब आप एक आइटम को स्क्रॉल करते हैं, तो आइटम 1 स्क्रीन से बाहर हो जाएगा, और आइटम 11 होगा प्रदर्शित हों। आइटम 11 के लिए दृश्य उत्पन्न करें, getView() विधि को कॉल किया जाएगा, और convertView यहां आइटम 1 का दृश्य है (जो अब नहीं है)। तो इसके बजाय आइटम 11 के लिए एक नया व्यू ऑब्जेक्ट बनाएं (जो महंगा है), convertView का पुन: उपयोग क्यों न करें? => हम सिर्फ convertView शून्य या नहीं, अगर नल नया दृश्य बनाते हैं, तो convertView का पुन: उपयोग करें।

  3. parentView दृश्य जिन्हें आइटम के दृश्य जो getView() उत्पन्न करता है निहित है। आम तौर पर यह ListView या गैलरी ...

नोट है: आप इस विधि का सीधे कॉल मत करो, बस कैसे आइटम के दृश्य उत्पन्न करने में माता-पिता को देखने बताने के लिए इसे लागू करने की जरूरत है।

+2

पैरेंट व्यू के लिए उत्कृष्ट स्पष्टीकरण, इस से बेहतर स्पष्टीकरण नहीं मिल सकता है, +1 –

+0

अद्भुत स्पष्टीकरण! – gabi

+0

महान स्पष्टीकरण +1 – tpk

5

लेआउटइनफ्लेटर का बिल्कुल सही कार्य क्या है?

जब आप एक्सएमएल का उपयोग करते हैं, तो आपके सभी यूआई तत्व केवल टैग और पैरामीटर होते हैं।इन यूआई तत्वों का उपयोग करने से पहले, (जैसे टेक्स्टव्यू या लीनियरलाउट), आपको इन एक्सएमएल तत्वों से संबंधित वास्तविक वस्तुएं बनाने की आवश्यकता है। यही वह है जो inflater के लिए है। Inflater, वास्तविक वस्तुओं को बनाने और सभी पैरामीटर सेट करने के लिए इन टैग और उनके संबंधित पैरामीटर का उपयोग करता है। इसके बाद आप findViewById() का उपयोग कर UI तत्व का संदर्भ प्राप्त कर सकते हैं।

मेरे द्वारा पढ़े गए सभी लेख क्यों जांचते हैं कि कन्वर्टव्यू शून्य है या नहीं? इसका मतलब क्या है जब यह शून्य है और इसका मतलब क्या नहीं है?

यह एक दिलचस्प है। आप देखते हैं, getView() को हर बार सूची में एक आइटम खींचा जाता है। अब, आइटम तैयार किए जाने से पहले, इसे बनाया जाना है। अब कनवर्ट व्यू मूल रूप से किसी आइटम को आकर्षित करने के लिए अंतिम बार देखा गया दृश्य है। GetView() में आप पहले xml को बढ़ाते हैं और फिर listitem के विभिन्न UI तत्व प्राप्त करने के लिए findByViewID() का उपयोग करें। जब हम (convertView == null) की जांच करते हैं तो हम जांचते हैं कि यदि कोई दृश्य शून्य है (पहले आइटम के लिए) तो इसे बनाएं, अन्यथा, यदि यह पहले से मौजूद है, तो इसका पुन: उपयोग करें, फिर से inflate प्रक्रिया को पार करने की आवश्यकता नहीं है । यह बहुत अधिक कुशल बनाता है।

आपको getView() में व्यूहोल्डर की अवधारणा में भी आना होगा। यह सूची को और अधिक कुशल बनाता है। हम जो करते हैं वह व्यूहोल्डर बनाते हैं और उन सभी यूआई तत्वों के संदर्भ को संग्रहीत करते हैं जिन्हें हम फुलाए जाने के बाद प्राप्त करते हैं। इस तरह, हम कई खोज ByViewId() को कॉल करने से बच सकते हैं और बहुत समय बचा सकते हैं। यह ViewHolder (convertView == null) स्थिति में बनाया गया है और setTag() का उपयोग कर कनवर्ट व्यू में संग्रहीत है। अन्य लूप में हम getView() का उपयोग कर इसे वापस प्राप्त करते हैं और इसका पुन: उपयोग करते हैं।

इस विधि को स्वीकार करने वाले पैरेंट पैरामीटर क्या है?

अभिभावक एक व्यू ग्रुप है जिस पर getView() द्वारा बनाया गया आपका दृश्य अंततः संलग्न है। अब आपके मामले में यह सूची दृश्य होगा।

आशा इस मदद करता है :)

0

तुम भी Adapter.java फ़ाइल में एडाप्टर इंटरफेस पर getView बारे में उपयोगी जानकारी पा सकते हैं। यह कहता है;

/** 
* Get a View that displays the data at the specified position in the data set. You can either 
* create a View manually or inflate it from an XML layout file. When the View is inflated, the 
* parent View (GridView, ListView...) will apply default layout parameters unless you use 
* {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)} 
* to specify a root view and to prevent attachment to the root. 
* 
* @param position The position of the item within the adapter's data set of the item whose view 
*  we want. 
* @param convertView The old view to reuse, if possible. Note: You should check that this view 
*  is non-null and of an appropriate type before using. If it is not possible to convert 
*  this view to display the correct data, this method can create a new view. 
*  Heterogeneous lists can specify their number of view types, so that this View is 
*  always of the right type (see {@link #getViewTypeCount()} and 
*  {@link #getItemViewType(int)}). 
* @param parent The parent that this view will eventually be attached to 
* @return A View corresponding to the data at the specified position. 
*/ 
View getView(int position, View convertView, ViewGroup parent);