2011-06-14 45 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

相關問題