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


101

मेरे प्रश्न हैं:

  1. क्या वास्तव में LayoutInflater का कार्य है?
  2. सभी लेख जो मैंने पढ़े हैं, अगर कनवर्सेशन शून्य है या नहीं तो पहले क्यों पढ़ें? इसका क्या मतलब है जब यह शून्य है और इसका क्या मतलब है जब यह नहीं है?
  3. मूल विधि क्या है जिसे यह विधि स्वीकार करती है?

जवाबों:


115

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

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

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

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

public View getView(int position, @Nullable 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इसका पुन: उपयोग कैसे किया जाता है।


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

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

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

71

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()उत्पन्न करता है।

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


2
माता-पिता के लिए अत्यधिक स्पष्टीकरण, कठबोली इस एक से बेहतर स्पष्टीकरण मिल सकता है, +1
अहमद एडेल इस्माइल

अद्भुत व्याख्या!
गाबी

महान विवरण +1
बजे

8

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

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

  1. यह जावा ऑब्जेक्ट्स जैसे LinearLayout और अन्य दृश्यों में लेआउट (आपके रिज / लेआउट / फ़ोल्डर पर xml फाइलें) को फुलाता है।

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

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


5

क्या वास्तव में LayoutInflater का कार्य है?

जब आप XML का उपयोग करके डिज़ाइन करते हैं, तो आपके सभी UI तत्व केवल टैग और पैरामीटर होते हैं। इससे पहले कि आप इन UI तत्वों का उपयोग कर सकें, (उदाहरण के लिए एक TextView या रैखिक), आपको इन xml तत्वों के अनुरूप वास्तविक ऑब्जेक्ट बनाने की आवश्यकता है। यह है कि बाढ़ के लिए क्या है। इनफ्लो, वास्तविक वस्तुओं को बनाने और सभी मापदंडों को सेट करने के लिए इन टैग और उनके संबंधित मापदंडों का उपयोग करता है। इसके बाद आप findViewById () का उपयोग करके UI तत्व का संदर्भ प्राप्त कर सकते हैं।

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

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

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

मूल विधि क्या है जिसे यह विधि स्वीकार करती है?

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

उम्मीद है की यह मदद करेगा :)


4
  1. लेआउट inflator आपके वर्तमान दृश्य में बाहरी XML को बढ़ाता / जोड़ता है।

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

  3. जनक दृश्य आपकी सूची का एकल कक्ष है ..


3
माता-पिता के दृष्टिकोण को यहां गलत तरीके से समझाया गया है। यह ListViewem नहीं ListViewem होगा
वरुण जैन

2

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

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

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

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या ViewGroupप्रत्येक पंक्ति Listviewया स्पिनर के लिए बनाएँ । आप इसे Viewया फ़ाइल में फ़ोल्डर ViewGroupमें परिभाषित कर सकते हैं और इसे क्लास ऑब्जेक्ट पर संदर्भ दे सकते हैं ।Layout XMLres/layoutAdapter

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

LayoutInflater वर्ग में एक तरीके से वृद्धि () है जो XML संसाधन लेआउट से व्यू ऑब्जेक्ट बनाते हैं।


0

आप Adcape.java फ़ाइल में Adapter इंटरफ़ेस में 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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.