【Android】提高Adapter的效率
来源:互联网 发布:大地彩票v6 源码 编辑:程序博客网 时间:2024/05/18 22:51
以下对Adapter的getView(intposition, View convertView, ViewGroup parent)方法做三种不同的测试。
直接打码:
原始方法:
// 方法一平均耗时: 6.3public View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubView item = inflater.inflate(R.layout.item, null);((ImageView) item.findViewById(R.id.image)).setImageResource((position & 1) == 1 ? R.drawable.img1: R.drawable.img2);((TextView) item.findViewById(R.id.tv)).setText(data[position]);return item;}
改进后:
// 方法二平均耗时: 0.8public View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubif (convertView == null) {convertView = inflater.inflate(R.layout.item, null);}((ImageView) convertView.findViewById(R.id.image)).setImageResource((position & 1) == 1 ? R.drawable.img1: R.drawable.img2);((TextView) convertView.findViewById(R.id.tv)).setText(data[position]);return convertView;}
再次改进:
private ViewHolder holder;// 方法三: 0.68public View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubbegin = System.currentTimeMillis();if (convertView == null) {convertView = inflater.inflate(R.layout.item, null);holder = new ViewHolder();holder.image = (ImageView) convertView.findViewById(R.id.image);holder.tv = (TextView) convertView.findViewById(R.id.tv);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.image.setImageResource((position & 1) == 1 ? R.drawable.img1: R.drawable.img2);holder.tv.setText(data[position]);end = System.currentTimeMillis();total += end - begin;System.out.println(total * 1.0 / position);return convertView;}static class ViewHolder {ImageView image;TextView tv;}
测试结果:
我用了500条记录,从开始一直滑动ListView到最下面,统计了这500次getView方法执行的平均时间,单位为毫秒:
方法一:6.3。
方法二:0.8。
方法三:0.68。
彪悍的结果不需要解释。
(不能上图,one week later 补上)
一些屁话:
1.ListView并不是一创建时就把所有的数据都加载,它本身有缓冲机制。
可见到不可见的Item会被回收,不可见到可见的Item会被创建添加。
如图所示:当向下滑动时,Item1就会被回收,Item8就会被创建。
2.item的创建添加靠的是getView方法,帮当屏幕滚动时该方法被调用得很强烈。
3.getView方法里的参数convertView在API里解释为:
The old view toreuse, if possible. Note: You should check that this view is non-null and of anappropriate type before using. If it is not possible to convert this view todisplay the correct data, this method can create a new view.
理解为View的再次使用,运用它可以减少重新使用inflater造成的资源滥用。但是如果ListView的item有多种类型的话,还得另外判断该convertView的类型。本例中只有一个类型。
4.如果有朋友在用ListView滚动时发现很卡,猛烈地建议告别方法一,尽量使用方法三。毕竟手机的反应时间并不是男人的战斗力时间越长越好。
- 【Android】提高Adapter的效率
- Android-优化UI性能(2)-提高Adapter的效率
- 使用ViewHolder模式来提高自定义adapter的效率
- 安卓自定义Adapter,以及如何提高ListView的效率
- 提高android ContentProvider的效率
- 提高android ContentProvider的效率
- 提高android代码效率的方法
- 提高android应用效率的一些知识点
- [转]提高android ContentProvider的效率
- Android如何提高ListView的滑动效率
- Android 提高开发效率的常用命令行
- Android提高开发效率的一些资料
- 提高Android开发效率的小技巧
- 快速提高Android开发效率的工具
- Android Studio之提高编译的效率
- Android提高篇之Adapter的抽象整合
- 提高eclipse使用效率—— 提高Android开发效率的小技巧
- 提高数据库的效率
- 使用递归 输出文件树
- 浅谈Javascript面向对象编程
- 登陆csdn 1000次
- 链表常用操作 (定义,创建,反转,合并,交叉)
- GetCurrentThread() returns pseudo handle, not the real handle.
- 【Android】提高Adapter的效率
- priority_queue例子
- 在VO中引用Controller层中的Session State的两种方法
- hdoj 1035(算是水题把)(屏蔽freopen)
- 莫让代码腐化:让营地比你来时更干净
- 项目管理: Maven 让事情变得简单--给您的下一个 Java 构建添加项目管理特性
- hdu1176免费馅饼
- Linuxx下printf格式符%d、%lld、%llx、%u等
- 与九期一起装系统(共同提高)