我知道已经有很多类似的问题,但我检查了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