簡體   English   中英

在Android上的ListView中加載延遲圖像

[英]Lazy-loading images in ListView on Android

我在ListView實現了延遲加載圖像。 我使用AsyncTask從Internet下載圖像並將其綁定到UIThread中的ImageView。

它的工作原理除外,當我滾動ListView變化很快時,下載的圖像有時被綁定到列表中的錯誤項目。

我想這個問題來自BaseAdapterconvertViewBaseAdapter 有什么想法可以解決嗎?

非常感謝。

編輯:我發布的答案如下:

public void setBitmap(int position, Bitmap image) {
    View itemView = mListView.getChildAt(position - mListView.getFirstVisiblePosition());
    if (itemView != null) {
        ImageView itemImageView = (ImageView) itemView.findViewById(R.id.item_imageview);
        itemImageView.setImageBitmap(image);
    }
}

在ListView中延遲加載圖像時會出現兩個問題。

  1. 舊圖像仍會顯示,直到加載新圖像。 這很簡單,只需將ImageView設置為圖像正在加載視圖或在開始圖像下載之前將其設置為不可見。
  2. 第二個問題難以解決。 想象一下,你在列表中滾動非常快。 現在,在舊的AsyncTask加載圖像之前,您的視圖可以被回收。 您現在有兩個正在運行的任務,在onPostExecute方法中將圖像設置為imageview。 現在短時間內將顯示錯誤的圖像,直到第二個任務完成,或者更糟糕的是由於某些網絡相關的原因,它們沒有按照它們開始的順序完成,並且您有錯誤的圖像覆蓋正確的圖像。 要解決此問題,您必須檢查任務完成后應顯示的圖像。 View類中,有兩種方法可以完全像這樣:

    setTaggetTag您可以將任何對象綁定到您想到的imageview。 在大多數情況下,在開始任務之前,我使用setTag將圖像的URL作為String綁定到imageview。 現在,我可以在任務完成后將getTag強制轉換為String,並將應顯示的URL與我下載的URL進行比較,並在必要時僅設置圖像。

在適配器中創建一個名為void setBitmap(Bitmap bitmap, int position)或類似函數。 當新位圖可用時,讓AsyncTask調用此方法。 然后,此方法可以在UI-Thread本身上調用notifyDataSetChanged()以確保刷新視圖。 在適配器中保持對視圖的引用(即使將它們保存在AsyncTask中)也是危險的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM