2013-06-05 78 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,这样它会重新加载下次。