今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题。

最近,发现app里的listview图片会出现闪烁的情况。我发现是由于调用notifyDataSetChanged这个方法时候,图片全部闪烁一下,原因是图片全部重新加载了一次,导致闪烁。后来修改为局部刷新,但是还是还是存在是不是闪烁的情况,于是在网上查找资料,最终解决了问题。这里记录一下。

一.网上无用的解决代码

网上关于图片闪烁的解决代码很多,但是大多不是我想要的。比如有人说:

真正的闪烁原因不是display和imageload方法的缘故,而是在设置option时,设置了.displayer(new FadeInBitmapDisplayer(200))的缘故,直接设置为.displayer(new SimpleBitmapDisplayer()),然后再getview方法中调用display方法,就不会闪烁了.这个我试过了,没有一点效果。

还有人说:

在一个频繁刷新的ListView中使用ImageLoader后,在某些手机上会发现图片闪动。经过分析,原来是DisplayImageOptions的问题。

之前的DisplayImageOptions是这样写的:

imageOptions = new DisplayImageOptions.Builder().bitmapConfig(Bitmap.Config.RGB_565).showStubImage(R.drawable.icon_default)  .showImageForEmptyUri(R.drawable.icon_default).showImageOnFail(R.drawable.icon_default).cacheInMemory(true)  .cacheOnDisc(true).build();  

其中的showStubImage()造成了加载前先显示默认图片的问题,造成了闪动。修改为以下代码后就正常了:

imageOptions = new DisplayImageOptions.Builder().bitmapConfig(Bitmap.Config.RGB_565)  .showImageForEmptyUri(R.drawable.icon_default).showImageOnFail(R.drawable.icon_default).cacheInMemory(true)  .cacheOnDisc(true).build();  

这个只是解决加载图片前显示默认加载图片的问题,和我的因为频繁刷新导致的问题不一样。

二.解决问题的代码

下面是我之前的getView方法中。下面的ImageLoader直接调用,造成每次notifyDataSetChanged,重新调用了ImageLoader方法。

 @Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.item_app_wall2, parent, false);holder = new ViewHolder();holder.icon = (ImageView) convertView.findViewById(R.id.app_icon);holder.name = (MarqueeText) convertView.findViewById(R.id.app_name);// holder.grade = (ImageView)// convertView.findViewById(R.id.grade);holder.size = (TextView) convertView.findViewById(R.id.app_size);holder.count = (TextView) convertView.findViewById(R.id.app_count);holder.ratingBar = (RatingBar) convertView.findViewById(R.id.grade);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}ImageLoader.getInstance().displayImage(searchAppList.get(position).getHttpIco(), holder.icon,DisplayImageOptionUtil.getInstance().getOptions());holder.name.setText(searchAppList.get(position).getName().trim());holder.size.setText(CommonUtil.format(searchAppList.get(position).getApkSize() / (float) 1024) + "M");AppStatistics statistics = searchAppList.get(position).getAppStatistics();if (statistics != null) {holder.count.setText(statistics.getDownloadCount() + "次");}holder.ratingBar.setRating(searchAppList.get(position).getAveccore() / 2f);return convertView;}

下面我做出了修改,如果当前图片是之前的图片,则不会调用ImageLoader,否则调用ImageLoader。

public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.item_app_wall2, parent, false);holder = new ViewHolder();holder.icon = (ImageView) convertView.findViewById(R.id.app_icon);holder.name = (MarqueeText) convertView.findViewById(R.id.app_name);// holder.grade = (ImageView)// convertView.findViewById(R.id.grade);holder.size = (TextView) convertView.findViewById(R.id.app_size);holder.count = (TextView) convertView.findViewById(R.id.app_count);holder.ratingBar = (RatingBar) convertView.findViewById(R.id.grade);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}if (searchAppList.get(position).getHttpIco().equals(holder.icon.getTag())) {} else {// 如果不相同,就加载。现在在这里来改变闪烁的情况ImageLoader.getInstance().displayImage(searchAppList.get(position).getHttpIco(), holder.icon,DisplayImageOptionUtil.getInstance().getOptions());holder.icon.setTag(searchAppList.get(position).getHttpIco());}holder.name.setText(searchAppList.get(position).getName().trim());holder.size.setText(CommonUtil.format(searchAppList.get(position).getApkSize() / (float)1024) + "M");AppStatistics statistics = searchAppList.get(position).getAppStatistics();if (statistics != null){holder.count.setText(statistics.getDownloadCount() + "次");}holder.ratingBar.setRating(searchAppList.get(position).getAveccore() / 2f);return convertView;
}

通过ImageView.getTag和setTag方法来,判定当前图片是否是之前的,如果是之前,则不会刷新图片,如果不是,再刷新。

简单讲讲,其实就是在每次getView时,ImageView通过setTag将家中图片的路径保存起来,当调用notifyDataSetChanged时,需要刷新界面,首先判断需要重新加载的图片路径和ImageView.getTag是否相同,如果相同,就不需要重新加载,这样避免了无用的重复加载相同图片。

android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题就讲完了。

就这么简单。



android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题相关推荐

  1. ImageLoader加载图片闪烁

    ImageAware imageAware = new ImageViewAware(holder.img, false); ImageLoader.getInstance().displayImag ...

  2. android listview 数据同步,android中ListView数据刷新时的同步方法

    本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...

  3. Android中使用ImageLoader加载图片

    Android上让人头疼的莫过于从网络上获取图片,然后显示图片,最后还要考虑到图片的回收问题,这之间只要有任何一个环节有问题都可能直接OOM.尤其在需要展示图片的列表页面,会加载大量网络上的图片,每当 ...

  4. android开发学习之路——连连看之加载图片(三)

    正如前面AbstractBoard类的代码中看到的,当程序需要创建N个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法将会随机从res\ dra ...

  5. Android——Xlistview上拉刷新下拉加载

    配置网络权限+xutils包+gson包 代码如下: values下修改strings添加 直接粘 <?xml version="1.0" encoding="ut ...

  6. recycler 刷新图片闪烁_android 解决RecyclerView notifyDataSetChanged刷新闪屏问题(图片刷新)...

    最近遇到了RecyclerView  在执行notifyDataSetChanged操作时会出现闪屏,图片刷新,然后根据网上资料提示使用 修改动画,设置动画时间 recyclerView.getIte ...

  7. android 图片加载 软引用_android Listview 软引用SoftReference异步加载图片

    首先说一下,android系统加载大量图片系统内存溢出的3中解决方法: (1)从网络或本地加载图片的时候,只加载缩略图.这个方法的确能够少占用不少内存,可是它的致命的缺点就是,因为加载的是缩略图,所以 ...

  8. Android中的缓存处理及异步加载图片类的封装

    一.缓存介绍: (一).Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效手段之一. 1.没有缓存的弊端: 流量开销:对于客户端--服务器端应用,从远程获取图 ...

  9. ImageLoader加载图片与文字

    //main方法 import android.support.annotation.IdRes; import android.support.v4.app.Fragment; import and ...

最新文章

  1. 2017年5个最佳网络监控工具 你知道哪些
  2. 8个步骤成功拖垮新业务线!
  3. dev里timeedit控件如何赋值_抽奖程序里的字节跳动模式和时长控制,让抽奖更有仪式感!...
  4. 天梯赛-是否完全二叉搜索树
  5. html5仿qq空间,JS实现的仿QQ空间图片弹出效果代码
  6. python学习笔记(对象)
  7. [Codeforces Round #152 (Div. 2)]A. Cupboards
  8. IBM Rational DOORS通过DXL进行二次开发
  9. Vue2.0安装教程
  10. 浅谈内存分配方式以及堆和栈的区别
  11. Flutter开发之——Future<dynamic> is not a subtype of type () void
  12. 100以内的勾股数python_Python实现获取前100组勾股数的方法
  13. java画哆啦A梦_java如何绘制哆啦A梦 java绘制哆啦A梦代码示例
  14. revit插件建模助手的【快速工具箱】功能
  15. Android系统应用隐藏和应用禁止卸载
  16. 累了,困了,来看“MySQL”,让你梦回吹角连营
  17. Python 解决warining的方法FutureWarning: warnings.warn(CV_WARNING, FutureWarning)
  18. 子网掩码、IP地址数、掩码长度对照表
  19. 网校搭建3:安装meEdu
  20. Hello World的正确打zhuang开bi方式———lambda表达式

热门文章

  1. CSS样式和class应用
  2. 我的探究:为什么.h头文件中不要写using namespace std
  3. 查询score中选学多门课程的同学中分数为非最高分成绩的记录。
  4. sql语句中`和'两个符号的区别
  5. (转)LinqToSql的连接字符串自动调用配置文件中的连接字符串
  6. 家里路由器如何共享同一个ip
  7. 计算机专业毕业了,还要不要参加培训班?——Leo网上答疑(8)
  8. 数据库存带微信表情的昵称
  9. AcWing 831. KMP字符串(模板)
  10. linux简单文件管理命令的使用