2009-12-15 91 views
0

我正在使用listview來顯示數據,在listview內部我正在每個listenite中使用圖像。ListItem lazyload AsyncTask圖像顯示問題

我下面這個教程 http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List4.html

new Handler().post(new Runnable(){ 

       @Override 
       public void run() { 
        //Need to subclass to use Asynctask 
        class DownloadImage extends AsyncTask<Void, Void, Void>{ 
         @Override 
         protected Void doInBackground(Void... params) { 
           Drawable dImage = Util.getImageFromURL(imageURL); 
            getImageIcon().setImageDrawable(dImage); 
          return null; 
         } 

        } 
        new DownloadImage().execute(); 
       } 

      }); 

這個不錯的lazzy加載圖片,但有一個問題,它纔會顯示用戶觸摸屏的任何圖像或嘗試滾動的結果或任何交互由用戶向手機設備鍵。

如果我嘗試滾動結果它顯示所有列表項圖像....什麼可能會出錯?

回答

1

沒有更多的上下文很難說。特別是,這個代碼是從哪裏調用的,getImageIcon()是做什麼的?

我看到的一個問題是,您將圖像圖標設置在後臺線程而不是UI線程中。這可能是它在ui事件觸發刷新之前似乎沒有改變的原因。嘗試將DownloadImage更改爲以下內容:

class DownloadImage extends AsyncTask<Void, Void, Drawable>{ 
     @Override 
     protected Drawable doInBackground(Void... params) { 
      return Util.getImageFromURL(imageURL); 
     } 

     @Override 
     protected void onPostExecute(Drawable d) { 
      getImageIcon().setImageDrawable(d); 
     } 

} 
new DownloadImage().execute(); 

如果我是對的,那應該解決問題。

如果這確實起作用,很好,但我認爲你的代碼可以使用一點清理。假如這一切都發生在UI線程中(這可能是真的,因爲你在這個線程中實例化一個新的Handler),你根本不需要使用Handler,也不需要創建一個新的Runnable接口。直接刪除它們並直接創建一個新的DownloadImage實例並調用execute()。