前言

ListView优化一直是一个老生常谈的问题。无论是面试还是寻常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看怎样最大化的优化ListView的性能。

  • 1.在adapter中的getView方法中尽量少使用逻辑
  • 2.尽最大可能避免GC
  • 3.滑动的时候不载入图片
  • 4.将ListView的scrollingCache和animateCache设置为false
  • 5.item的布局层级越烧越好
  • 6.使用ViewHolder

1.在adapter中的getView方法中尽量少使用逻辑

不要在你的getView()中写过多的逻辑代码,我们能够将这些代码放在别的地方。比如:

优化前的getView():

@Override
public View getView(int position, View convertView, ViewGroup paramViewGroup) {Object current_event = mObjects.get(position);ViewHolder holder = null;if (convertView == null) {holder = new ViewHolder();convertView = inflater.inflate(R.layout.row_event, null);holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}//在这里进行逻辑推断。这是有问题的 if (doesSomeComplexChecking()) {holder.ThreeDimention.setVisibility(View.VISIBLE);} else {holder.ThreeDimention.setVisibility(View.GONE); }// 这是设置image的參数,每次getView方法运行时都会运行这段代码。这显然是有问题的RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);holder.EventPoster.setLayoutParams(imageParams);return convertView;
}

优化后的getView():

@Override
public View getView(int position, View convertView, ViewGroup paramViewGroup) {Object object = mObjects.get(position);ViewHolder holder = null;if (convertView == null) {holder = new ViewHolder();convertView = inflater.inflate(R.layout.row_event, null);holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);//设置參数提到这里,仅仅有第一次的时候会运行,之后会复用 RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);holder.EventPoster.setLayoutParams(imageParams);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}// 我们直接通过对象的getter方法取代刚才那些逻辑推断。那些逻辑推断放到别的地方去运行了holder.ThreeDimension.setVisibility(object.getVisibility());return convertView;
}

2.GC 垃圾回收器

当你创建了大量的对象的时候。GC就会频繁的运行。所以在getView()方法中不要创建非常多的对象。最好的优化是,不要在ViewHolder以外创建不论什么对象。假设你的你的log里面发现“GC has freed some memory”频繁出现的话。那你的程序肯定有问题了。

你能够检查一下:
a) item布局的层级是否太深
b) getView()方法中是否有大量对象存在
c) ListView的布局属性

3.载入图片

假设你的ListView中须要显示从网络上下载的图片的话。我们不要在ListView滑动的时候载入图片,那样会使ListView变得卡顿,所以我们须要再监听器里面监听ListView的状态。假设滑动的时候,停止载入图片,假设没有滑动,则開始载入图片

listView.setOnScrollListener(new OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView listView, int scrollState) {//停止载入图片 if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {imageLoader.stopProcessingQueue();} else {//開始载入图片imageLoader.startProcessingQueue();}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {// TODO Auto-generated method stub}});

4.将ListView的scrollingCache和animateCache设置为false

scrollingCache: scrollingCache本质上是drawing cache,你能够让一个View将他自己的drawing保存在cache中(保存为一个bitmap),这样下次再显示View的时候就不用重画了,而是从cache中取出。默认情况下drawing cahce是禁用的。由于它太耗内存了,可是它确实比重画来的更加平滑。

而在ListView中,scrollingCache是默认开启的,我们能够手动将它关闭。

animateCache: ListView默认开启了animateCache,这会消耗大量的内存,因此会频繁调用GC,我们能够手动将它关闭掉

优化前的ListView

<ListViewandroid:id="@android:id/list"android:layout_width="match_parent"android:layout_height="wrap_content"android:cacheColorHint="#00000000"android:divider="@color/list_background_color"android:dividerHeight="0dp"android:listSelector="#00000000"android:smoothScrollbar="true"android:visibility="gone" /> 

优化后的ListView

<ListViewandroid:id="@android:id/list"android:layout_width="match_parent"android:layout_height="wrap_content"android:divider="@color/list_background_color"android:dividerHeight="0dp"android:listSelector="#00000000"android:scrollingCache="false"android:animationCache="false"android:smoothScrollbar="true"android:visibility="gone" />

5.降低item的布局的深度

我们应该尽量降低item布局深度,由于当滑动ListView的时候,这回直接导致測量与绘制,因此会浪费大量的时间。所以我们应该将一些不必要的布局嵌套关系去掉。降低item布局深度

6.使用ViewHolder

这个大家应该非常熟悉了,可是不要小看这个ViewHolder,它能够大大提高我们ListView的性能

后文

ListView的优化我们已经讲完了。假设在你的项目中。这些基本优化你还没有做到的话。那么你的ListView是有问题的,还有非常大的提升潜力。以后再使用ListView的时候,一定要将这几点考虑进去,发挥它的最大的性能。

这些东西其实只要技术到了一定高度,经验多了就很稀疏平常。

学无止境,更多的知识在等着我们去学习。

需要学习进阶框架技术的可以扫码领取资料!

**《Android架构开发手册》**Android进阶框架学习教材

由于文章内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要**《Android架构开发手册》**完整文档的可以加微信 即可免费领取!

目录

【提升栈】ListView优化相关推荐

  1. ListView优化的代码

    第三种ListView优化:通过convertView+ViewHolder来实现,ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 ...

  2. 和vs版本关系_栈局部变量优化探究,意外发现了 vs 的一个 bug ?

    缘起 我在<栈又溢出了>一文中记录了一个奇怪的栈溢出问题.虽然解决了,但是总感觉哪里不太合理.我想,vs 一定有一个合理的设置.一起折腾起来吧! 查找工程设置 本以为能找到某个编译选项对局 ...

  3. ListView优化机制及滑动时数据时出现的数据错乱重复问题

    ListView优化机制及滑动时数据时出现的数据错乱重复问题 转载于:https://www.cnblogs.com/zhujiabin/p/5596998.html

  4. 国际互联网计算与物联网大会ICOMP 2017高度赞誉DroiBaaS全栈式优化架构

    2017年5月,DroiBaaS坚持自研的全栈式优化云计算架构投稿国际互联网计算与物联网大会(The 18th International Conference on Internet Computi ...

  5. 面试之 listview优化

    2019独角兽企业重金招聘Python工程师标准>>> 摘用别人的,谢谢作者 Adapter的作用是界面与数据之间的桥梁,通过设置适配器至ListView控件后(如调用ListVie ...

  6. 提升效率:优化Java代码的35个小技巧

    每天早晨,干货准时奉上! 本文作者:萌小Q 来源: www.cnblogs.com/Qian123/p/6046096.html 前言 代码优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方 ...

  7. 快速提升网站SEO优化排名技巧有哪些?

    网站优化如果没有排名,那么网站建设的将毫无意义.做网站的目的就是要让更多的用户通过关键词搜索能到我们的网站,从而带来更多的流量和精准用户,促进效益转化.那么网站要怎样做才能快速的提升网站排名呢?下面就 ...

  8. Android之ListView优化

    关于ListView几个方面的优化: ListView的大小设定固定值; 复用convertView, 使用ViewHolder提高在容器中查找组件的效率; 使用分页加载; 快速滚动时, item不显 ...

  9. Android listview优化以及listview混合itemview

    listView = (ListView) findViewById(R.id.listview); mAdapter = new VideoListAdapter(this); listView.s ...

最新文章

  1. Lucene核心数据结构——FST存词典,跳表存倒排或者roarning bitmap 见另外一个文章...
  2. Spring学习(五)——Spring注解(一)
  3. python 群控源代码_自动化 带你用 Python 实现自动化群控设备 _好机友
  4. 从技术角度聊聊,短视频为何让人停不下来?
  5. Django Channels 入门指南
  6. AM,DSB,SSB,FM信号调制matlab
  7. pythonnamedtuple定义类型_python-自定义type.NamedTuple
  8. 10 Equality constrained minimization
  9. 微信怎么绑定消息服务器吗,fastweixin: 极其方便的实现微信公众平台服务端开发,2行代码完成服务器绑定,3行代码实现用户消息监听...
  10. node.js学习笔记5——核心模块1
  11. 为什么要使用Redis?
  12. 从未停止!OpenGL的版本历史和发展
  13. 孤岛能源安卓游戏源码
  14. 将Ext JS 5应用程序导入Web项目以及实现本地化
  15. iPhone 记录之 点与像素
  16. uniapp定位和选择城市
  17. 总结:Springboot的pom配置
  18. iphone11屏比例_苹果11的屏幕分辨率是多少
  19. 淘宝客订单同步,关联私域授权用户,给用户返分,流程是如何串起来的
  20. C++ string 简单截取字符串使用

热门文章

  1. 联发科MT6167处理器详细参数,MT6167射频芯片资料
  2. 全网唯一js数组排序方法(自创排序)
  3. cad中怎么随意移动图形_CAD中不用移动命令也可以移动图形
  4. 哈工大慕课 学生成绩管理系统V3.0
  5. 随机生成字母数字的组合
  6. 获取相册图片的几种方式总结
  7. Lisp 的本质(1)
  8. 助理产品经理、产品经理、资深产品经理有什么区别?
  9. Weston Inside - ivi-shell分析
  10. 【深入理解】Python网络编程