2013-04-30 60 views
3

我有一個顯示兩列圖像的gridview。我加載這些圖像與異步任務(請參閱這篇文章Lazy load of images in ListViewAndroid - Gridview圖像在滾動上混合

但是,當我滾動gridview,位置圖像混合。例如,第14張圖像顯示第1張圖像,我認爲視圖試圖在異步任務完成之前顯示舊圖像。

我的代碼:

public Content getItem(int position) { 
     return contents.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public boolean hasStableIds() { return true; } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     Thumbnail contentView; 
     Content current = contents.get(position); 
     if (convertView == null) { 
      contentView = new Thumbnail(mContext); 
     } 
     else { 
      contentView = (Thumbnail) convertView; 
     } 

     contentView.title = current.getTitle(); 
     contentView.image = current.getImage(); 
     contentView.link = current.getLink(); 
     contentView.init(); 

     return contentView; 
    } 

初始化函數

TextView titleText = (TextView)super.findViewById(R.id.titleText); 
    titleText.setText(title); 

    ImageView imageControl = (ImageView)super.findViewById(R.id.thumbImage); 
    DrawableManager loadImage = new DrawableManager();    loadImage.fetchDrawableOnThread(imgUrl, imageControl); 

等待您的幫助

感謝

回答

3

這是因爲資源再利用的。你應該做的:

  1. 首先,只需設置某種默認圖像到您的ImageView(contentView.image.setImageResource(DEFAULT_RESOURCE))getView方法內(過渡默認畫面比錯一個更好)。

  2. 爲您的圖片設置唯一標籤,例如要加載的圖片的位置或網址(contentView.image.setTag(url))。 當的AsyncTask完成後,您可以使用一些檢查像

    String url=(String)imageView.getTag(); 
    
    if (url.equals(mUrl)) { //mUrl can be transmitted to AsyncTask instance separately 
        mActivity.runOnUiThread(new Runnable() { 
    
        @Override 
        public void run() { 
         imageView.setImageDrawable(bmp); 
        }); 
    }); 
    } 
    

需要這種耐心,因爲Adapter不適合所有N ImageView分配內存的N項。它只存儲可見項目和一些保留的ImageView所需的金額。因此,不保證您存儲的參考文件將在幾秒內實際發生,因爲它可能變得不可見並且被可見文件重複使用。

+0

添加了這一行。但沒有任何改變。它顯示舊圖像,並在異步任務完成時用新圖像進行更改。有時它也顯示錯誤的圖像。我認爲異步任務指向錯誤的圖像控制。還嘗試將標記設置爲imageview。 – dracula 2013-04-30 11:47:45

+0

是的,也可能因爲視圖重用而發生(例如,由於流過屏幕邊緣而變得不可見的ImageView可以被重複用於具有相同內存指針的可見視圖)。但設置標籤肯定會幫助你(並幫助我多次)。 – 2013-04-30 12:05:10

+0

設置網址標籤和比較標籤與網址字符串爲我工作:)非常感謝你安德烈。這真的很頭疼 – dracula 2013-04-30 12:34:08

0

請勿自行加載圖像。使用Universal Image Loader。它可以緩存,圖像和加載位圖。讓你的問題消失。它還支持顯示存根圖像和滾動時自動暫停等。

它解決您的具體問題,只需加載imageView的最後一個實例的圖像,如果你重用它。

imageLoader.displayImage(imageUri, imageView); 

是異步加載圖像所需的全部內容。

+0

我使用DrawableManager ..見第2篇文章。 http://stackoverflow.com/questions/541966/how-do-i-do-a-lazy-load-of-images-in-listview – dracula 2013-04-30 12:27:37

+0

該職位是3歲。世界已經改變。使用UIL。只要看看你發佈的問題。 – richardwiden 2013-04-30 12:32:45

+0

我會嘗試UIL.Thank你 – dracula 2013-04-30 12:39:42