2015-09-04 89 views
0

我有一個列表視圖的圖像。異步任務完成後更新列表視圖Android

如果本地緩存中不存在圖像,則佔位符圖像將保留在圖像的位置。

然後運行一個異步任務從服務器下載圖像。

異步任務完成後,我將imageView位圖設置爲下載的圖像。 然後我打電話notifyDataSetChanged()

問題是我需要向下滾動並向上滾動以顯示每個單元格以顯示已下載的新圖像。它不會自動更新單元格。

所以我必須:

public class ImageLoadTask extends AsyncTask<Void, Void, Bitmap> { 

    private ImageView imageView; 

    public ImageLoadTask(ImageView imageView) { 
     this.imageView = imageView; 
    } 

    @Override 
    protected Bitmap doInBackground(Void... params) { 

     // download image from server and return  
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     super.onPostExecute(result); 
     imageView.setImageBitmap(result) 
     notifyDataSetChanged() 
    } 
} 

在我getView()方法,我有:

if(image exists in cache){ 
    myImageView.setBitmap(image in Cache); 
}else{ 
    new ImageLoadTask(myImageView).execute() 
} 

這樣被保存在緩存做工精細任何圖像。

任何必須首先下載的圖像都不會正確更新,除非您向下滾動並再次備份。

什麼問題?

+0

我建議你使用凌空或畢加索圖書館來加載圖像。 –

+0

你需要做以下 //清除現有項目 'listAdapter.clear();' //添加新項目 'listAdapter.addAll(updatedvalues);' //通知,該數據已經改變 ' listAdapter.notifyDataSetChanged();' –

回答

0

我相信你正在做thigs已經完成,工作很好。

我建議你使用庫來加載帶有listview的圖像。其中之一是picasso Picasso Android庫。這個庫提供下載和緩存,並可以很容易地(一行)顯示它們到imageview。它也爲佔位符圖像提供了可能性。

Picasso.with(context) 
    .load(url) 
    .resize(50, 50) 
    .centerCrop() 
    .into(imageView) 

這裏是stackoveflow另一個問題: Using Picasso library with ListView

編輯: 如果使用畢加索你也將與在滾動圖片顯示錯誤的問題解決。如果您正在使用AsyncTask加載/下載它們,並且沒有正確執行,則會發生這種情況。

我回答問題有關此問題的幾個daays前:Why are wrong images getting loaded in ListView occasionally?

+0

我喜歡這個圖書館......從來沒有聽說過它。我有一個名爲'setRoundedCorners(位圖,左,右,上,下)'的方法。我通常會通過這裏運行位圖。我將如何使用這種方法與畢加索? –

+0

你可以使用picasso [picasso](http://square.github.io/picasso/)的transform api來看看=) –

0

首先,如果您是直接使用ImageView的對象,那麼你就需要調用notifyDataSetChanged。 其次,您需要確保的是,您傳遞的ImageView對象仍然存在於所請求的相同URL中,也就是說,您必須知道Android將重新使用視圖,並且可能在您將滾動的ImageView對象您爲URL所請求的內容將改爲其他某個網址。

我在一個非常類似的場景中工作,在那裏我有一個獨立的設計,如Adapter - > ImageViewRequest(該類將用於發佈請求,並且該類保持ImageView和URL的映射。因此,對於映射完成的每個請求條目,並且對於每個響應,我們檢查URL的響應是當前請求的該ImageView條目的URL,然後進行相應設置) - > AsyncTask 同時還要確保在設置你可以在runOnUIThread任務中做到這一點,以確保圖像正確加載,否則你可能會崩潰,說你設置在一個錯誤的線程。

希望可以幫到:)