2011-06-14 62 views
0

我知道已经有很多类似的问题,但我检查了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问题。我完全不知道如何避免位图内存泄漏问题,因为只要它们在列表中,我就无法回收它们。

回答

2

适配器在ListView内重用视图。因此,你永远不会知道,如果

private ImageView iv; 

包含你想设置的ImageView对象。您应该使用id在列表中找到适当的单元格。

重新考虑使用缩略图或缩小图像大小。你可以在这里阅读更多: Lazy load of images in ListView

+0

这正是我找到的!非常感谢,我不知道它被称为“延迟加载”。 – 2011-06-15 05:27:57

相关问题