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 ...
随机推荐
- python 人工智论
https://www.zhihu.com/question/21395276 基于python深度学习库DeepPy的实现:GitHub - andersbll/neural_artistic_st ...
- 随机取若干条记录的SQL语句
原文:随机取若干条记录的SQL语句 MySql中随机提取数据库N条记录 select * from TableName order by rand() limit N SQLServer中随机提取 ...
- linux 之创建文件命令
1.vi vi 1.txt 会直接创建并打开一个文件1.txt 2.touch touch的作用是更改一个文件或目录的时间.touch 2.txt 如果2.txt不存在,则创建空文件2.txt 3.e ...
- Android如何缓存你的BITMAP对象
在app中通常最占内存.占流量的元素就是图片了,图片往往又无处不在,特别是伴随着list,GridView或者ViewPager出现,这些图片随着你的滑动操作,时而出现在你的屏幕中,时而消失在屏幕之外 ...
- hdu 1283 最简单的计算机
水题. .. import java.util.Scanner; public class Main { static int m1, m2; static int r1, r2, r3; publi ...
- ES6里关于函数的拓展(一)
一.形参默认值 Javascript函数有一个特别的地方,无论在函数定义中声明了多少形参,都可以传入任意数量的参数,也可以在定义函数时添加针对参数数量的处理逻辑,当已定义的形参无对应的传入参数时为其指 ...
- Spark-Streaming之window滑动窗口应用
Spark-Streaming之window滑动窗口应用,Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据,会被 ...
- 服务器和java程序的桥梁--jdbc/hibernate
现实的应用程序都是用户通过可视化界面发出指令从而修改数据库.本篇文章以Oracle为例,模拟怎么通过java代码实现数据库的增删改查. 新建一个Java项目,要建好桥梁,首先要拷入驱动Jar包放在项目 ...
- Solidworks草图或者特征无法删除怎么办
单击重新建模之后即可删除.
- C++003基础
1.C++对C的扩展 1简单的C++程序 1.1求圆的周长和面积 数据描写叙述: 半径.周长,面积均用实型数表示 数据处理: 输入半径 r. 计算周长 = 2*π*r : 计算面积 = π* r2 . ...