Android数据适配器(Adapter)优化:使用高效的ViewHolder
原文链接:http://stackvoid.com/using-adapter-in-efficiency-way/
在使用Listview或GridView的时候,往往须要自己定义数据适配器。一般都要覆写getView(),在该方法中有一个convertView參数。该參数就是用来载入数据时的View。
刚開始学习的人简单但低效的方式
1 public View getView(int position, View convertView, ViewGroup parent) {
2
3 View item= inflater.inflate(R.layout.good_list_item, null, false);
4
5 ImageView img = (ImageView) item.findViewById(R.id.img);
6 TextView price = (TextView) item.findViewById(R.id.price);
7 img.setImageResource(R.drawable.ic_launcher);
8 price.setText("$"+list.get(position).price);
9
10 return item;
11 }
每次载入view,都要又一次建立非常多view对象,假设listview中有一万条数据,而且每条view中的数据都比較复杂。这样的载入方式就歇菜了。
利用convertView
利用convertView来又一次回收View,效率有了本质提高。
View的每次创建是比較耗时的。因此对于getview方法传入的convertView应充分利用 != null的推断 。
1 public View getView(int position, View convertView, ViewGroup parent) {
2
3 if(convertView==null){
4 convertView = inflater.inflate(R.layout.good_list_item, null, false);
5 }
6 TextView tv_price = (TextView)convertView.findViewById(R.id.price)
7 ImageView iv = (ImageView)convertView.findViewByID(R.id.img);
8
9 return convertView;
10 }
使用ViewHolder
ViewHolder将须要缓存的view封装好。convertView的setTag才是将这些缓存起来供下次调用。
当你的listview里布局多样化的时候 viewholder的作用体现明显,效率再一次提高。 View的findViewById()方法也是比較耗时的,因此须要考虑仅仅调用一次,之后就用View.getTag()方法来获得ViewHolder对象。
1 class ViewHolder{
2 ImageView img;
3 TextView price;
4 }
5 public View getView(int position, View convertView, ViewGroup parent) {
6 ViewHolder holder = new ViewHolder();
7 if(convertView==null){
8 convertView = inflater.inflate(R.layout.good_list_item, null, false);
9 holder.img = (ImageView) convertView.findViewById(R.id.img);
10 holder.price = (TextView) convertView.findViewById(R.id.price);
11 convertView.setTag(holder);
12 }else{
13 holder = (ViewHolder) convertView.getTag();
14 }
15 //设置holder
16 holder.img.setImageResource(R.drawable.ic_launcher);
17 holder.price.setText("$"+list.get(position).price);
18
19 return convertView;
20 }
优雅的使用ViewHolder
使用ViewHolder时。每次一遍一遍的findViewById。一遍一遍在ViewHolder里面加入View的定义。view一多。是不是感觉烦爆了,base-adapter-helper这个类库似乎完美的攻克了这个问题。
其设计思想是使用 SparseArray来存储view的引用,取代了原本的ViewHolder,不用声明一大堆View。简洁明了。
我也自己动手写了一个简单版的ViewHolder。
1 public class ViewHolder{
2
3 private final SparseArray<View> views;
4 private View convertView;
5
6 private ViewHolder(View convertView){
7 this.views = new SparseArray<View>();
8 this.convertView = convertView;
9 convertView.setTag(this);
10 }
11
12 public static ViewHolder get(View convertView){
13 if (convertView == null) {
14 return new ViewHolder(convertView);
15 }
16 ViewHolder existedHolder = (ViewHolder) convertView.getTag();
17 return existedHolder;
18 }
19
20 public <T extends View> T getView(int viewId) {
21 View view = views.get(viewId);
22 if (view == null) {
23 view = convertView.findViewById(viewId);
24 views.put(viewId, view);
25 }
26 return (T) view;
27 }
28 }
使用的话就超级简单和简洁了:
1 public View getView(int position, View convertView, ViewGroup parent) {
2 if (convertView == null) {
3 convertView = LayoutInflater.from(context)
4 .inflate(R.layout.good_list_item, null, false);
5 }
6
7 ViewHolder mViewHolder = ViewHolder.get(convertView);
8 TextView price = mViewHolder.getView(R.id.price);
9 //...其它getView
10
11 return convertView;
12 }
Android数据适配器(Adapter)优化:使用高效的ViewHolder的更多相关文章
- Android数据适配器Adapter简介
1.简介 Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式显示到view上,在常见的View(List View,Grid View)等地方都需要用到Adapter! ...
- Android 数据适配器
把复杂的数据(数组.链表.数据库.集合等)填充到指定的视图界面上. arrayAdapter(数组适配器): 用于绑定一些格式单一的数据,数据源:数据或者集合. private Li ...
- 代码优化>>>Android ListView适配器三级优化详解
转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:点击打开链接 http://blog.csdn.net/qq_32059827/article/details/52718489 ...
- Android之ListView性能优化——使用ConvertView和ViewHolder
使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的.这种优化的优点如下: 1)重用了ConveertView,在很大程度上减少了内 ...
- Android之ListView性能优化——一行代码绑定数据——万能适配器
如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...
- Android学习之Adapter(数据适配器)
1.定义 数据适配器是AdapterView视图(如ListView - 列表视图控件.Gallery - 缩略图浏览器控件.GridView - 网格控件.Spinner - 下拉列表控件. ...
- Android必学之数据适配器BaseAdapter
什么是数据适配器? 下图展示了数据源.适配器.ListView等数据展示控件之间的关系.我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的.数据适配器正是建立了数据源与 ...
- 浅析android适配器adapter中的那些坑
做项目中遇到的,折磨了我将近两天,今天把经验分享出来.让大家以后少走点弯路,好了.简单来说一下什么是android的适配器,怎样定义.怎样添加适配器的重用性.怎样去减少程序的耦合性 适配器顾名思义是用 ...
- ListView和Adapter数据适配器的简单介绍
ListView 显示大量相同格式数据 常用属性: listSelector listView每项在选中.按下等不同状态时的Drawable divider ...
随机推荐
- Spark-submit脚本解读
#!/usr/bin/env bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contrib ...
- 去掉wget烦人的 “eta(英国中部时间)” 提示
gentoo 里的 wget ,从1.12版本开始,就一直有个不影响功能的小毛病:由于中文翻译的失误,进度提示的时候,会被拉成很多行.原因就是原来英文的ETA这3个字母,被翻译成了 “eta(英国中部 ...
- Android源码解析系列
转载请标明出处:一片枫叶的专栏 知乎上看了一篇非常不错的博文:有没有必要阅读Android源码 看完之后痛定思过,平时所学往往是知其然然不知其所以然,所以为了更好的深入Android体系,决定学习an ...
- cornerstone
这东西是mac上的svn,忽然就不对劲了.感觉就是代码就是没拿对.里面显示都是正确的. 删了重新拿....
- 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT-2 运行可执行文件
个人认为这条命令做的参数比较混乱,PATHSTR是指可执行文件路径+最终文件名,DIRNAME是指可执行文件路径,最后COMNDLINE可有可无,是指带参数运行启动的文件 测试可以正常运行 ...
- Android学习(十五) 系统服务
一.常用系统服务 后台Service在系统启动时被SystemService开启 1.MountService:监听是否有SD卡安装和移除. 2.ClipboardService:提供剪切板功能. 3 ...
- Warning: isMounted(...) is deprecated in plain JavaScript React classes.
1.错误提示 警告:isMounted(…)在纯 react.js 类中被弃用. 2.原因解析 出现此错误提示的原因是源代码内有已被React舍弃的代码,但此并不影响程序运行. 在index.js 内 ...
- js中数组的合并和对象的合并
1 数组合并 1.1 concat 方法 var a = [1,2,3], b = [4,5,6]; var c = a.concat(b); console.log(c);// 1,2,3,4,5, ...
- vue-router 响应路由参数的变化
提醒一下,当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用.因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效.不过,这也意味着组件的生命周 ...
- JavaScript类数组转换为数组 面试题
1.JavaScript类数组转换为数组 (1)方法一:借用slice (2)方法二:Array.from 2.代码 <!DOCTYPE html> <html lang=" ...