यहां बिल्कुल नया एंड्रॉइड डेवलपर है।तेजी से स्क्रॉल करते समय getView को गलत स्थिति के साथ बुलाया जाता है
मुझे एक अजीब समस्या आई है कि मुझे यकीन नहीं है कि कैसे काम करना है। मैंने यहां चारों ओर बहुत सी समस्याएं पढ़ी हैं, जैसे कि वे एक ही समस्या है जैसे वे हैं, लेकिन उनकी समस्याओं का समाधान यहां क्या हो रहा है, इस पर लागू नहीं होता है।
मेरे पास एक कस्टम सूची है जो एक अलग वर्ग का उपयोग करके सेट अप करें जो बेसएडाप्टर को विस्तारित करता है और एक व्यू धारक का उपयोग करता है (मैंने इसे कस्टम सूचीदृश्य के विभिन्न उदाहरणों को देखकर सेट किया है)। इसमें एक टेक्स्ट व्यू, एक बटन, एक प्रोग्रेस बार और एक छवि बटन है, और ये आइटम एक फ़ाइल डाउनलोड करने के लिए इस्तेमाल किए गए असिनकटास्क के आधार पर छुपा/बदला गया है।
जब मैं धीरे-धीरे सूची में स्क्रॉल करता हूं तो सब कुछ ठीक काम करता है। जब मैं सूची को तेजी से ऊपर/नीचे स्क्रॉल करता हूं, तो ऐसा लगता है कि सूची में कुछ कक्षों के विचार अन्य कोशिकाओं को फिर से सौंपे जाते हैं।
मैं अपने एडाप्टर कक्षा में मेरे "getView" विधि के शीर्ष में इस लाइन डाल:
@Override
public View getView(final int pos, View convertView, ViewGroup parent)
{
Log.i("ks3","getView called, position is " + pos);
मैं अपने सूची में 7 आइटम, और उनमें से 6 स्क्रीन पर फिट है। जब वह पहली बार प्रदर्शित किया जाता है, मैं अपने लॉग में इस देखें:
getView called, position is 0
getView called, position is 1
getView called, position is 2
getView called, position is 3
getView called, position is 4
getView called, position is 5
जब मैं अगले आइटम पर धीरे-धीरे नीचे स्क्रॉल करें, यह अगले बाहर मुद्रित किया जाता है:
getView called, position is 6
जब मैं वापस ऊपर स्क्रॉल इस, :
getView called, position is 0
नीचे जा रहे हैं और ऊपर धीरे-धीरे इन परिणामों दोषरहित उत्पादन।
जब मैं आगे पीछे जल्दी से स्क्रॉल शुरू करते हैं, यह समय की एक गुच्छा इस संदेश को बाहर प्रिंट, ज्यादातर स्थिति के रूप में 6 और 0 दिखा रहा है, लेकिन कभी कभी मैं इन के साथ-साथ देखेंगे:
getView called, position is 1
getView called, position is 5
पदों 1 और 5 को कॉल नहीं किया जाना चाहिए, क्योंकि वे हमेशा स्क्रीन पर होते हैं। ऐसा लगता है जैसे GetView सब झुका हुआ है। उसी समय, जैसा कि मैंने पहले कहा था, मेरी सूची अजीब लगेगी। छवि बटन एक सेल को ऊपर या नीचे ले जाया जाएगा जहां वे नहीं होना चाहिए।
यदि मैं आसानी से स्क्रॉल करने के लिए वापस जाता हूं, तो मुझे स्थिति के लिए केवल 0 और 6 का दृश्य दिखाई देता है।
मुझे ईमानदारी से यह सुनिश्चित नहीं है कि इस के आसपास कैसे काम करें। मैंने सोचा कि शायद मैं सीमित कर सकता हूं कि आप सूची के माध्यम से कितनी तेजी से स्क्रॉल करने में सक्षम हैं, लेकिन काम करने वाली कुछ भी नहीं ढूंढ पाए हैं।
धन्यवाद!
संपादित करें: मैं इस प्रश्न के बारे में कुछ चीजें अपडेट करना चाहता था। सबसे पहले, सूची में Google वीडियो से यहां और यहां से एक टिप्पणी से, यह मेरे ध्यान में आया है कि अन्य दृश्यों के लिए getView को बुलाया जा सकता है, फिर मैंने कल्पना की कि यह माप के लिए क्या था, और इसलिए मुझे चिंतित नहीं होना चाहिए जो मैंने मूल रूप से सोचा था, वह मेरी समस्या का हिस्सा था (यह कि मैंने सोचा था कि getView को गलत स्थिति के साथ बुलाया जा रहा था)।
दूसरा, मैंने कई बार देखा कि "आपके एडाप्टर के अंदर विचारों को कैश करना" बहुत बुरा विचार है। मैं इसका क्या मतलब समझता हूं बिल्कुल स्पष्ट नहीं हूं, लेकिन मुझे पूरा यकीन है कि यह उन चीजों में से एक है जो मैं गलत कर रहा हूं (मैं एक बटन का उदाहरण सहेजता हूं, प्रगतिबार, छवि बटन ...)।
कि, इस तथ्य के साथ कि मैं getView के बाहर के विचारों को अद्यतन करता हूं और मैं NotifyDataSetChanged() को सूचित नहीं करता हूं; जो लोग एक साथ कुछ भद्दा सामान होने के कारण हैं।
कहना मैं एक भी TextView के साथ एक item_view (लेआउट) है, तो एडाप्टर पालन होना चाहिए की सुविधा देता है जब तक आपकी कस्टम ListView कुछ फंकी नहीं कर रही है, यह रीसाइक्लिंग समस्या की तरह लगता है, अपना पूरा getView() कोड पोस्ट करें। – dmon
यदि आपको अपने कोड में कोई त्रुटि नहीं मिलती है और आप हनीकॉम या ऊपर का उपयोग करते हैं तो आप अपनी सूची लेआउट के लिए हार्डवेयर त्वरण को अक्षम करने का प्रयास कर सकते हैं। हार्डवेयर त्वरण संभावित रूप से ऐसी त्रुटियों का कारण बन सकता है। – zapl
यह एक रीसाइक्लिंग मुद्दे की तरह महसूस करता है। मैं सूची में Google वीडियो पर एक नज़र डालने जा रहा हूं और देखता हूं कि सूची दृश्य का उपयोग करने के तरीके के साथ कोई चमकदार समस्याएं हैं या नहीं। – Droidmon