我知道已經有很多類似的問題,但我檢查了20多個答案,但他們都沒有解決我的問題。如何使用ASyncTask更新自定義ListView中的ImageView?
首先,我有一個適配器擴展SimpleCursorAdapter
。我在其中使用自定義視圖,其中包括ImageView
。佈局是:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="@dimen/listitem_height" android:gravity="center_vertical">
<ImageView android:id="@+id/row_image" android:layout_width="@dimen/listitem_height"
android:layout_height="fill_parent" android:paddingRight="@dimen/spaceLarge"
android:layout_centerVertical="true" android:layout_marginLeft="@dimen/spaceMedium"
android:src="@drawable/unknown_album" />
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
android:gravity="center_vertical|left">
<TextView android:id="@+id/row_text" android:layout_width="fill_parent"
android:textAppearance="?android:attr/textAppearanceMedium"
android:gravity="center_vertical|left" android:layout_height="wrap_content" />
<TextView android:id="@+id/title" android:layout_width="fill_parent"
android:textAppearance="?android:attr/textAppearanceSmall"
android:gravity="center_vertical|left" android:layout_height="wrap_content"
android:textColor="#95D0B4" />
</LinearLayout>
然後,ImageView
需要一些時間來加載圖像,所以如果我在主線程做,滾動將成爲可怕的。因此,我想使用AsyncTask
加載圖像,但現在我面臨的問題是滾動時重新使用視圖的ListView
。
也就是說,下面的代碼無法正常工作:
class ImageSetter extends AsyncTask<String, Void, Bitmap> {
private ImageView iv;
ImageSetter(ImageView iv) {
this.iv = iv;
}
@Override
protected Bitmap doInBackground(String... params) {
String path = (String) params[0];
try {
return BitmapFactory.decodeFile(path);
} catch (OutOfMemoryError e) {
Log.w(Utils.TAG, "", e);
return null;
}
}
@Override
protected void onPostExecute(Bitmap result) {
iv.setImageBitmap(result);
super.onPostExecute(result);
}
}
我在適配器調用在bindView()
。在滾動時更改ImageView
,並且結果Bitmap被設置爲錯誤的位置。
有沒有人如何解決這個問題?非常感謝你!
P.S.快速滾動列表時,我也遇到嚴重的OutOfMemory
問題。我完全不知道如何避免位圖內存泄漏問題,因爲只要它們在列表中,我就無法回收它們。
這正是我找到的!非常感謝,我不知道它被稱爲「延遲加載」。 – 2011-06-15 05:27:57