2010-10-08 15 views
6

मैं अपने getView में इस कोड का उपयोग में दिखाने:गलत छवि मेरी ListView पंक्तियों

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 

     LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.listrow, null); 
    } 
    Order o = items.get(position); 

    if (o != null) { 
     TextView tt = (TextView) v.findViewById(R.id.toptext); 
     ImageView thumb = (ImageView) v.findViewById(R.id.icon); 

     if (o.getOrderDrawable() != null) { 
      thumb.setImageDrawable(o.getOrderDrawable()); 
     } else { 
      tt.setText(o.getOrderTitle()); 
     } 

    } 
    return v; 
} 

समस्या है जब स्क्रॉल है, कभी-कभी सही छवि दिखाती है, लेकिन कभी-कभी वापस/आगे स्क्रॉल करते समय, छवियां यादृच्छिक रूप से दिखाई देती हैं और यह पंक्ति से जुड़ी नहीं होती है।

छवियां वेब से डाउनलोड की गई हैं।

मुझे इस समस्या को कैसे हल करना चाहिए?

उत्तर

24

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

आपकी समस्या यह है कि यदि आपको वर्तमान सूची आइटम के लिए कोई ड्रायबल नहीं मिलता है, तो आप ImageView को खाली नहीं करते हैं और न छुपाते हैं। आपको उस मामले में thumb.setImageDrawable(null) करना चाहिए, या thumb.setVisibility(View.GONE) करना चाहिए।

+0

धन्यवाद, यह हल हो गया! समस्या यह थी कि मेरी कुछ छवियां वेब सर्वर पर चली गई थीं। इसके लिए शुक्रिया। – Curtain

+0

जब मैं प्लेसहोल्डर छवियों को प्रदर्शित करना चाहता हूं, जबकि छवियों को इंटरनेट से पकड़ा जाता है। मुझे यह कैसे करना है? और कौन सा ऑपरेशन महंगा है vi.inflate (R.layout.listrow, null)? – Karussell

+0

अग्रिम धन्यवाद – Mojiiz

-1

यदि आप कनवर्ट व्यू का उपयोग करना बंद करते हैं (जो आपको बिल्कुल चाहिए), और हर बार वापस आने के लिए एक नया नया दृश्य उत्पन्न करें, तो क्या यह सही काम करता है? मुझे लगता है कि जिस तरह से आप विचारों का पुन: उपयोग करते हैं, वैसे ही समस्या समस्या है।

+1

विचारों पुन: उपयोग बंद नहीं करते: तो धन्यवाद सोमबोर :-)

यहाँ यह मेरी टुकड़ा है। आपको विचारों को सही तरीके से पुन: उपयोग करना होगा, लेकिन आपको निश्चित रूप से उनका पुन: उपयोग करना चाहिए। – Janusz

+0

जेनुज़ ने क्या कहा। कुछ दर्जन वस्तुओं के साथ एक सूची बनाने की कोशिश करें, और इसके माध्यम से फ़्लिंग करें (या इससे भी बदतर, इसके माध्यम से तेज़ स्क्रॉल करें)। विचारों का पुन: उपयोग किए बिना, प्रदर्शन भयानक होगा। – benvd

-1

मैंने यहां सही समाधान के रूप में चिह्नित समाधान का उपयोग करने का प्रयास किया, लेकिन यह स्क्रॉलिंग के दौरान गलत छवि की समस्या का समाधान नहीं करता है। मैंने दूसरे (ज़्सबॉम्बर एर्डोडी-नागी) की कोशिश की और अब यह वाकई ठीक है।

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    /* 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.tweet_list, null); 
    } 
    */ 
    LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View v = vi.inflate(R.layout.tweet_list, null); 
    final Status status = getItem(position); 
    if (status != null) { 
     TextView statusName = (TextView) v.findViewById(R.id.statusName); 
     TextView statusText = (TextView) v.findViewById(R.id.statusText); 
     TextView statusWhen = (TextView) v.findViewById(R.id.statusWhen); 
     TextView statusScreenName = (TextView) v.findViewById(R.id.statusScreenName); 
     final ImageView statusUserImage = (ImageView) v.findViewById(R.id.statusUserImage); 
     statusName.setText(status.getUser().getName()); 
     statusScreenName.setText("@" + status.getUser().getScreenName()); 
     statusText.setText(status.getText()); 
     statusWhen.setText(dateTimeFormatter.format(status.getCreatedAt())); 
     URL url = status.getUser().getProfileImageURL(); 
     String imageCacheKey = url.getPath(); 
     Drawable cachedImage = imageCache.get(imageCacheKey); 
     if (null != cachedImage) { 
      statusUserImage.setImageDrawable(cachedImage); 
     } else { 
      new DownloadImageTask(statusUserImage, imageCacheKey).execute(url); 
     } 

    } 
    return v; 
} 
+0

अरे एलेक्स, मुझे आपके जैसा ही अनुभव था लेकिन फिर मुझे एहसास हुआ कि मुझे प्रत्येक दृश्य (सभी टेक्स्ट व्यू और छवि दृश्य) के लिए दृश्यता (व्यू.ऑन) सेट करने की आवश्यकता है। एक बार मैंने ऐसा करने के बाद, मैं कनवर्ट व्यू का पुन: उपयोग करने में सक्षम था। मुझे लगता है कि यह बेहतर है, संभवतः पुन: उपयोग करने के लिए शायद अधिक कुशल। – wuliwong

+0

यह निश्चित रूप से जाने का तरीका नहीं है। हर बार एक नई सूची वस्तु को दिखाने की जरूरत है, आप इसे पूरी तरह से खरोंच से बना रहे हैं। इन्फ्लूआउट लेआउट एक बहुत महंगा ऑपरेशन है। आपको कन्वर्ट व्यू का पुन: उपयोग करना चाहिए। मुझे यकीन है कि यह काम करता है, बस कुशलता से नहीं। यदि आप कन्वर्ट व्यू का पुन: उपयोग करते हैं और आपके पास अभी भी गलत छवियां दिख रही हैं, तो ऐसा इसलिए है क्योंकि आप अपनी सूची आइटम में सभी विचारों को सही ढंग से सेट नहीं कर रहे हैं। – benvd