2012-06-25 14 views
19

मेरे ListView में प्रत्येक आइटम ImageView और TextView containt, यह दूरस्थ जानकारी से भरा जाएगा।फिर भी एक और getView कई बार कहा जाता है

मैं ImageView के लिए एक यूआरएल है, इसलिए मैं एक AsyncTask जो छवि को डाउनलोड करता है शुरू करने और डाउनलोड किया बिटमैप साथ setImageBitmap कॉल करेंगे।

यह बहुत अच्छी तरह से चला जाता है लेकिन जब सूची दृश्य बनाया जाता है, तो getView() अक्सर कॉल किया जाता है। यह पहली 10 पंक्तियों (केवल 7 दृश्यमान) के लिए getView के बारे में 7 गुना कॉल करता है। (तो: 0, 1, आदि, 10, 0, 1 आदि)।

तो मैं बस 10 वीं आइटम तक आसानी से स्क्रॉल कर सकता हूं। लेकिन उसके बाद, प्रत्येक नई पंक्ति के लिए सूची दृश्य पहली 10 वस्तुओं के लिए getView के बारे में 7 बार फिर से कॉल करता है। (यह अंतराल का कारण बन जाएगा ..)

लेकिन जब मैं AsyncTask से हटा देता हूं, तो यह सब नहीं होगा!

समस्या क्या हो सकती है? क्या यह हो सकता है कि कुछ लेआउट बड़े हैं जो getViews की एक और लकीर का कारण बनेंगे?

यहाँ कुछ कोड:

<ListView 
    android:id="@+id/mylist" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_alignParentBottom="true" 
    android:layout_below="@+id/mydivider" 
    android:divider="@+color/mycolor" 
    android:dividerHeight="2dp" 
    android:fadingEdge="none" 
    android:fastScrollEnabled="true" 
    android:listSelector="@android:color/transparent" 
    android:scrollbars="horizontal" 
    android:scrollingCache="false" 
    android:smoothScrollbar="false" /> 

AsyncTask:

public static class MyTask extends AsyncTask<String, Integer, Bitmap> { 
    private LruCache<String, Bitmap> mMap; 
    private String mUri; 
    private int mPosition; 
    private ViewHolder mHolder; 

    public MyTask (ViewHolder holder, int position, LruCache<String, Bitmap> map) { 
     mMap = map; 
     mHolder = holder; 
     mPosition = position; 
    } 

    @Override 
    protected Bitmap doInBackground(String... url) { 
     mUri = url[0]; 
     return getBitmapFromURL(mUri); 
    } 

    @Override 
    protected void onPostExecute(Bitmap b) { 
     if (b != null) { 
      mMap.put(mUri, b); 
      if (mPosition == mHolder.position) { 
       holder.image.setImageBitmap(b); 
      } 
     } 
    }; 
} 

getView()

row = convertView; 
ViewHolder holder; 
if (row == null) { 
    row = vi.inflate(R.layout.mylayout, null); 
    holder = new ViewHolder(); 
    holder.image = (ImageView) row.findViewById(R.id.myimage); 
    holder.title = (TextView) row.findViewById(R.id.mytext); 
    row.setTag(holder); 
} else { 
    holder = (ViewHolder) row.getTag(); 
} 

holder.title.setText("text"); 
holder.image.setImageResource(R.drawable.mydefaulticon); 
holder.position = position; 
startMyTask(content, holder, position); 

कुछ अधिक जानकारी:

एक नया दृश्य बना दिया जाता है स्टैकट्रैक शो n getView ListView.makeAndAddView() से बुलाया गया था लेकिन getViews की बेकार लकीर में यह ListView.measureHeigthOfChildren()

तो यह की तरह लेआउट बदल गया है जब मैं बिटमैप सेट लगता है से आ रही है ...

+0

हाँ तो लग रहा है मैं भी माता-पिता को फिर से लेआउट यह आत्म जब छवि माता पिता ऊंचाई भी that..But से प्रभावित हो के रूप में जोड़ा जाना चाहिए लगता है कि यह क्या मुझे यकीन है कि नहीं सोचा है .. इस लिंक पर –

उत्तर

32

समस्या ListView के लेआउट में था।

पैरामीटर layout_widthwrap_content स्थापित किया गया था जब मैं देर से उत्तर के लिए fill_parent समस्या गायब हो गया ...

+2

को इसके लिए धन्यवाद नहीं बदल रहा हूं। 100% काम किया। – Ron

+0

मेरे लिए भी काम किया। मुझे आश्चर्य है कि क्या यह किसी सूची के अंतर्निहित आकार से संबंधित है, यदि यह इसे भरने के बजाय अपने माता-पिता से मेल खाता है तो सीमित रहें? एक बड़ी सूची दृश्य लॉजिकल रूप से getView() को कॉल करेगा क्योंकि अधिक से अधिक व्यक्तिगत आइटम उपलब्ध हैं। –

+1

मेरे मामले में, getView एक पद के लिए बार-बार बुलाया जा रहा था और असीम भले ही उस विशेष स्थिति कुछ खास नहीं था। मेरे पास एक ही स्क्रीन के साथ-साथ एक अन्य दृश्य प्रकार की तरह कई दृश्य प्रकार थे। समस्या यह थी कि मेरे पास एक लेआउट में कई आइटम थे और अन्य वस्तुओं के बाद शेष स्थान लेने के लिए लेआउटवेइट = "1" द्वारा निर्धारित वस्तुओं में से एक चौड़ाई थी। निश्चित चौड़ाई के लिए इसे पुन: व्यवस्थित करने से समस्या हल हो गई। – velis

3

मैं सुझाव है कि आप इसे देखना वीडियो http://www.youtube.com/watch?v=wDBM6wVEO70

मूल रूप से एंड्रॉयड यह दृश्य ऊंचाइयों और सामान की गणना है के लिए getView कई बार फोन करेगा, ताकि आप अपने async में कैश के कुछ प्रकार लागू करने के लिए की जरूरत है, जाँच http://code.google.com/p/android-query/ जो है कि आप प्रमाणीकरण

2
का उपयोग नहीं करते

समस्या यह है कि आपकी ListView नहीं जानता कि प्रत्येक आइटम का क्या है। प्रारंभ करते समय, ListView अपने सभी बच्चों को माप देगा और इस जानकारी पर खुद को आकर्षित करेगा। आप अपने AsyncTask के साथ क्या कर रहे हैं, सूची में आइटम्स के आकार को बदल रहा है और ListView को पूरी तरह से फिर से खींचने की अनुमति नहीं दे रहा है। इसका परिणाम आपकी सूची दृश्य में अजीब तरीके से व्यवहार करने के लिए होता है।

समाधान: आप अपने AsyncTask की PostExecute में) एडाप्टर notifyDataSetChanged (का उपयोग कर को सूचित करके अपने ListView अद्यतन करना चाहिए। यह ListView को नई जानकारी के साथ आकर्षित करने की अनुमति देगा।

मुझे उम्मीद है कि यह काम करता है!

कुछ उपयोगी लिंक्स:

http://thinkandroid.wordpress.com/2012/06/13/lazy-loading-images-from-urls-to-listviews/

Lazy load of images in ListView

+0

देखो: http://stackoverflow.com/a/5092426/929075 सूचित करेंडेटाट चेंजड मदद नहीं करेगा जब मैं केवल एक दृश्य को अपडेट करना चाहता हूं। मैं ArrayList –

0

क्षमा करने के लिए इसे बदल दिया है। मुझे गैलरी विजेट के लिए मेरे एडाप्टर में एक ही समस्या का सामना करना पड़ रहा था। मैंने सार्वभौमिक छवि लोडर को नियोजित किया था। Martijn के समाधान मेरे लिए काम किया। क्या सब मैं करना था notifyDataSetChanged() जब छवि पूरी तरह से डाउनलोड किया गया था और imageView स्थापित किया जा रहा था जोड़ने के लिए किया गया था।

0

मैं fill_parent ListView में ऊंचाई के रूप में उपयोग करने की कोशिश, लेकिन मैं यह सही प्राप्त करने में असमर्थ था लेकिन कैसे कभी मैं इसे बनाने convertViews रोकने अगर यह अपनी पहले से ही मौजूद द्वारा की कोशिश की। यह मेरे appoach में ठीक काम करता है।

 @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
     if (convertView != null) 
      return convertView; 
     else { 
      //your code... 
     } 
    } 
संबंधित मुद्दे