21

की getView() विधि का स्पष्टीकरण ArrayAdapter की getView() विधि की व्याख्या कर सकता है।एक ArrayAdapter

मैं डॉक्स पढ़ सकते हैं और यह तीन पैरामीटर है:

  • position: एडाप्टर के डेटा के आइटम जिसकी दृश्य हम चाहते हैं निर्धारित भीतर आइटम की स्थिति।
  • convertView: यदि संभव हो तो पुन: उपयोग करने का पुराना दृश्य। नोट: आपको यह जांचना चाहिए कि यह दृश्य उपयोग करने से पहले गैर-शून्य और उचित प्रकार का है। यदि सही डेटा प्रदर्शित करने के लिए इस दृश्य को परिवर्तित करना संभव नहीं है, तो यह विधि एक नया दृश्य बना सकती है।
    विषम सूचियां उनके दृश्य प्रकारों को निर्दिष्ट कर सकती हैं, ताकि यह दृश्य हमेशा सही प्रकार का हो (getViewTypeCount() देखें और getItemViewType (int) प्राप्त करें)।
  • parent: माता-पिता है, यह दृश्य अंततः

से जोड़ दी जाएगी मैं position पैरामीटर समझा। जैसे उन्होंने कहा, यह आइटम की स्थिति का अर्थ है, जिसे देखने का अनुरोध किया गया है।

convertView कहां से आता है। मैंने कई उदाहरण देखे हैं जहां वे जांचते हैं कि convertView शून्य है। यदि शून्य है, तो वे पंक्ति लेआउट का एक नया उदाहरण बढ़ाते हैं, इसे पॉप्युलेट करते हैं और इसे वापस करते हैं। मुझे लगता है कि मैंने अपने सिर को भी उसके चारों ओर प्राप्त कर लिया है लेकिन एक चीज अभी भी मुझे परेशान करती है। convertView पैरामीटर के माध्यम से पारित किया गया लेआउट क्या है। क्या the resource parameter that is passed in when initialising the ArrayAdapter है? getView() द्वारा लौटाए गए अंतिम लेआउट की कैश की गई प्रति है?

और आखिरकार। parent पैरामीटर क्या करता है। मैंने इसका उपयोग करने वाले बहुत से उदाहरण नहीं देखे हैं। उनमें से ज्यादातर बस पंक्ति लेआउट का पुन: उपयोग/फुलाते हैं और इसे वापस करते हैं। क्योंकि मैं अपने ListView में एक पर क्लिक एनीमेशन है

(मैं पूछ रहा हूँ। विशेष रूप से this one that aims to replicate Spotify's dropdown quick action menu। मेरे एनीमेशन एक छोटे से सुस्त हो गया है। थोड़ी देर के लिए इस समस्या का निदान करने के बाद, मुझे एहसास हुआ है कि इस की वजह से किया गया है तथ्य यह है कि मेरी getView() विधि को पूरा करने में थोड़ा समय लगता है क्योंकि मैं प्रत्येक पुनरावृत्ति में एक ताजा पंक्ति लेआउट बढ़ा रहा हूं। किसी ने ViewHolder में पंक्ति लेआउट को कैशिंग करने का सुझाव दिया है जबकि अन्य उदाहरण convertView पैरामीटर का उपयोग करने के लिए इंगित करते हैं यानी केवल पंक्ति लेआउट को बढ़ाते हैं यदि convertView शून्य है।)

उत्तर

44

क्या getView() द्वारा दिए गए अंतिम लेआउट की कैश की गई प्रति है?

convertView एक पंक्ति है कि स्क्रीन छोड़ दिया (तो यह getView विधि द्वारा दिया पिछली बार देखने नहीं है) का दृश्य है। उदाहरण के लिए, सूची सबसे पहले दिखायी जाती है, इस मामले में convertViewnull है, कोई पंक्ति दृश्य पहले बनाया गया था और स्क्रीन को छोड़ दिया गया था। यदि आप नीचे स्क्रॉल करते हैं, तो पंक्ति 0 स्क्रीन छोड़ देगा (अब और दिखाई नहीं देगी), जब ऐसा होता है तो ListView उस दृश्य को बाद में उपयोग करने के लिए कैश में रखना चुन सकता है (यह समझ में आता है, क्योंकि ListView की पंक्तियां आम तौर पर होती हैं केवल डेटा के साथ एक ही लेआउट अलग है)। कैश में कुछ विचार रखने का कारण और बाद में उनका उपयोग करना क्योंकि getView विधि को कई बार बुलाया जा सकता है (प्रत्येक बार उपयोगकर्ता स्क्रॉल अप/डाउन और स्क्रीन पर नई पंक्तियां दिखाई देता है)। यदि प्रत्येक बार पंक्ति दृश्य को पुनर्निर्मित करने की आवश्यकता होती है तो इसके परिणामस्वरूप बहुत सारी वस्तुओं को बनाया जा सकता है जो कि बचने के लिए कुछ है।getView विधि में आप यह देखने के लिए convertView देखेंगे कि यह null है या नहीं। यदि यह null है तो आप एक नया पंक्ति दृश्य बनाएं और डेटा के साथ इसे पॉप्युलेट करें, यदि यह null नहीं है, तो ListView ने आपको पिछला दृश्य पेश किया है। इस पिछले दृश्य होने का मतलब है कि आपको एक नया पंक्ति लेआउट बनाने की आवश्यकता नहीं है, इसके बजाय आपको सही डेटा के साथ पॉप्युलेट करना चाहिए, क्योंकि कैश किए गए दृश्य में अभी भी पुराना डेटा संलग्न है (आप पर बहुत सारे प्रश्न देखेंगे stackoverflow जहां उपयोगकर्ता पूछते हैं कि उनके ListView की पंक्तियां स्क्रॉल करते समय डुप्लिकेट क्यों कर रही हैं)।

पैरेंट पैरामीटर क्या करता है। मैंने इसका उपयोग कई उदाहरण नहीं देखा है। उनमें से ज्यादातर बस पंक्ति लेआउट का पुन: उपयोग/फुलाते हैं और इसे वापस कर देते हैं।

इसे नई फुलाए/निर्मित पंक्ति के लिए सही LayoutParams प्राप्त करने के लिए उपयोग किया जाना चाहिए। उदाहरण के लिए, यदि आप एक लेआउट बढ़ाते हैं जिसमें रूट के रूप में RelativeLayout है और LayoutParams प्राप्त करने के लिए आप parent का उपयोग नहीं करते हैं तो आपको पंक्ति लेआउट के साथ कुछ समस्याएं हो सकती हैं। विचार में माता-पिता लेने के लिए आप का प्रयोग करेंगे:

convertView = getLayoutInflater().inflate(R.layout.row_layout, parent, false); 
+3

यह वास्तव में एक अच्छा जवाब है! – Tarik

+0

सबसे अच्छा जवाब tnx –

2

convertView की मेरी समझ है कि यह अनिवार्य रूप से देखा गया है कि कर रहे हैं क्योंकि वे इस समय इस्तेमाल किया जा रहा नहीं पुनर्नवीनीकरण कर दिए गए हैं - उदाहरण के लिए, आप सूची नीचे स्क्रॉल, शीर्ष पर वाले लोग स्क्रीन पर नहीं हैं, इसलिए जब आप एक नए दृश्य की आवश्यकता होती है तो वे इस पैरामीटर में उपयोग के लिए पारित हो जाते हैं (इसलिए आपको अप्रयुक्त लोगों को निष्क्रिय होने के दौरान एक नया नया निर्माण करने की आवश्यकता नहीं है)। आईओएस की एक समान विधि है जिसे dequeueReusableCellWithIdentifier कहा जाता है। यदि आपकी सूचीदृश्य की प्रत्येक पंक्ति में एक ही संरचना है, तो इसे उचित प्रकार पर डालना सुरक्षित है और इसमें केवल जानकारी अपडेट करें - टेक्स्ट, इमेज इत्यादि। यह एक ऐसा दृश्य होगा जिसे पहले getView() द्वारा वापस किया गया था सूची।

parent के साथ मेरा सबसे अच्छा अनुमान (और यह स्वीकार्य रूप से अनुमान है) यह है कि यह एडाप्टर की सूची एक बच्चा है। यदि आपको किसी संदर्भ की आवश्यकता है, संसाधन प्रणाली तक पहुंच है, तो सूची के माता-पिता दृश्य से जानकारी प्राप्त करने या प्राप्त करने के लिए यह आपको प्रतिपादन प्रणाली पर एक मार्ग प्रदान करता है।

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