ImageLoader 图片会闪烁,如何解决

天王盖地虎626 发布于 2015/09/17 23:50
阅读 3K+
收藏 1

代码部分,

DisplayImageOptions options = new DisplayImageOptions.Builder()
//     .showImageOnLoading(R.drawable.ic_launcher)
     .showImageForEmptyUri(R.drawable.loading_image)
     .showImageOnFail(R.drawable.load_failed_bit)
     .resetViewBeforeLoading(true)
     .cacheInMemory(true).cacheOnDisk(true)
     .imageScaleType(ImageScaleType.EXACTLY)
     .bitmapConfig(Bitmap.Config.RGB_565)
     .considerExifParams(true)
     .displayer(new SimpleBitmapDisplayer())
     .build();
   if(!imageUrl.equals(imageView.getTag())){
    imageView.setTag(imageUrl);
   }
   ImageLoader.getInstance().displayImage(imageUrl, imageView, options);

在listview中,加载朋友圈信息,如图,每次点赞或评论后,发现图片就会闪烁下,感觉体验很不好,请问下,imageloader出现图片闪烁的原因可能是什么?

从网上找了下,听说要加上setTag方法(见代码标红的地方),但是,依然会闪烁

每次点赞或评论的时候,最后执行代码是
    adapter.notifyDataSetChanged(); 理论上应该不会出现图片闪烁呀,请问如何解决?
   

加载中
0
铂金小鸟
铂金小鸟

notifyDataSetChanged 会使listview刷新,重新加载显示的view。

个人分析应该有2中情况。

1:没使用ViewHolder

解决方法:使用ViewHolder。

2:已经显示好的图片 ----> 点赞 -----> notifyDataSetChanged ---> listview重新加载view ---->  ImageLoader 设置了OnLoading 的图片 ---> ImageLoader 加载完成,显示加载后的图片。

这个流程一看就明白了,简化下就是

已经显示好的图片  ---》 被ImageLoader设置成了 OnLoading的图片  --》ImageLoader加载完成,重新显示之前的图片。

这样来回一切换就造成了闪烁。

最简单的验证方法:移除options的.showImageOnLoading(R.drawable.ic_launcher); 看下是否闪烁。

解决方法:在adapter的getView里面,判断当前view是否已经显示图片,是否显示了对的图片。如果是,就不需要ImageLoader再去加载。

0
天王盖地虎626
天王盖地虎626

引用来自“铂金小鸟”的评论

notifyDataSetChanged 会使listview刷新,重新加载显示的view。

个人分析应该有2中情况。

1:没使用ViewHolder

解决方法:使用ViewHolder。

2:已经显示好的图片 ----> 点赞 -----> notifyDataSetChanged ---> listview重新加载view ---->  ImageLoader 设置了OnLoading 的图片 ---> ImageLoader 加载完成,显示加载后的图片。

这个流程一看就明白了,简化下就是

已经显示好的图片  ---》 被ImageLoader设置成了 OnLoading的图片  --》ImageLoader加载完成,重新显示之前的图片。

这样来回一切换就造成了闪烁。

最简单的验证方法:移除options的.showImageOnLoading(R.drawable.ic_launcher); 看下是否闪烁。

解决方法:在adapter的getView里面,判断当前view是否已经显示图片,是否显示了对的图片。如果是,就不需要ImageLoader再去加载。

测试了下,好像不是你说的情况哦
0
ArrayListt
ArrayListt

我有时候也会遇到,

有时候又遇不到。

我感觉这个和调用Adapter的notifyDataSetChanged 方法没有什么直接关系。

我怀疑是你在getView的设置imageView的图片源的时候,可能不同的框架封装,或者加载的效率不一样,以及图片大小的问题,才会导致图片闪烁。

我是这样的怀疑的。


0
天王盖地虎626
天王盖地虎626

问题解决,本着分享精神,我把我的解决办法说下

因为,我这个问题,出现在listview中嵌套gridview造成的,也就是说listview中的每个item都有一个gridview

比方说,listview在加载数据的时候用到适配器 listviewAdapter对象

listview.setAdapter(listviewAdapter); 进行加载显示数据
或者用listviewAdapter.notifyDataSetChanged()来显示修改过的数据

因为listview中的每个item有一个gridview,用来承载一组图片

于是,我在listviewAdapter的方法getView方法中new另外一个适配器gridviewAdapter对象,这个时候,问题来了
如果这个listview有10个item,是不是要new 10个gridviewAdapter对象,这第一影响性能,第二,就是要命的图片闪烁问题了

比方说,这个时候,我对第5个item进行点赞或评论操作,listviewAdapter的方法getView中,在改变第5个item的数据的时候,又要new一个
gridviewAdapter对象,然后gridviewAdapter.setAdapter(gridview); 这个时候,必然出现图片闪烁。

后来,我想了一个办法,用下面的方法,

adapter=(ClassDynamicPicDetailListAdapter)hodler.picView.getAdapter();

每次先执行下面的语句,检查有没有存在了adapter了,如果存在,则直接更新数据后
gridviewAdapter.notifyDataSetChanged();来更新数据,从而避免图片闪烁

这是,我的解决办法,欢迎大家评论,或许我的说法有些问题,希望能听到更好的解决办法

返回顶部
顶部