2013-06-05 130 views
5

我正在使用ArrayAdapter在具有無限滾動功能的ListView中設置數據。在ListView的行中有一個ImageView和兩個TextViews。起初,我使用10個項目加載ListView,向下滾動時,我調用setonscrolllistener中的Web服務將下一個10個項目加載到ListView。當新項目添加到Arraylist時,我只需撥打adapter.notifysetdatachanged來告訴適配器刷新ListView。添加新項目時ListView閃爍

現在的問題是,無論何時將新項添加到ListView中,整個ListView刷新並導致ListView中已加載的圖像閃爍。是的,我將光盤和內存中的所有圖像緩存起來,並且代碼非常順利地進行緩存。

我也嘗試使用此adapter.addall(myarraylist)將數據添加到適配器中,但它沒有幫助。 ImageViews仍然閃爍。我在StackOverflow上搜索了很多關於它的信息,發現無法在ListView中添加和顯示更多項目而無需刷新整個listView。我已經知道,但必須有一些方法可以將新數據添加到ListView,而不是刷新已加載的數據。

我正在像這樣設置適配器。

public View getView(int position, View view, ViewGroup parent) 
     { 

     int main = R.layout.layout; 
     ViewHolder holder = null; 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (view == null) { 

      holder = new ViewHolder(); 
      view = inflater.inflate(main, null); 
      holder.image = (ImageView) convertView.findViewById(R.id.imageview); 

      ///More stuff 

      view.setTag(holder); 
     } else { 
      holder = (ViewHolder)view.getTag(); 
     } 

     // Loading ImageViews by Urls 

     return view; 
    } 

任何人都可以請點亮它嗎?

+0

不完全確定,但這可能是相關的。 http://stackoverflow.com/questions/13322575/android-visible-listview-images-flicker-when-adding-data-to-arrayadapter – Zerkz

+0

試試這個https://github.com/commonsguy/cwac-endless –

+0

你能展示如何將圖像加載到視圖中?歡呼 – asheinfeld

回答

2

看來你正在做的是正確的方式,所以這個問題可能來自你的imageLoader。如果url相同,它不應該在imageview上再次設置圖像。

例如您可以在imageView上使用setTag (url)方法,並測試url是否已更改。

希望這會幫助你。

+2

看起來這是Universal Image Loader的問題。我會嘗試使用另一個庫,並告訴您問題是否仍然存在。謝謝回覆。 –

+1

在我的情況下,這是圖像加載器問題。只要我開始檢查代碼是否要下載相同的圖像,閃爍效果就消失了。 – Bobrovsky

1

解決方法是在沒有更改圖像時不重新加載圖像。

在您的適配器getView()做的事:

// schedule rendering: 
final String path = ... (set path here); 
if (holder.lastImageUrl == null || !holder.lastImageUrl.equals(path) 
       || holder.headerImageView.getDrawable() == null) { 
    // refresh image 
    imageLoader.displayImage(imageUri, imageAware); 
} else { 
    // do nothing, image did not change and does not need to be updated 
} 

成功(添加ImageLoadingListener)設置holder.lastImageUrl =路徑,對失敗和取消設置holder.lastImageUrl爲null,這樣它會重新加載下次。