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