【Android】论ViewHolder存在的意义

第一次学ListView基本是半懂,adapter也是看着别人的代码打一遍硬生生记下来的,以致于一直不怎么懂ViewHolder的做用。java

到后来学有小成后,自做聪明的放弃了ViewHolder的写法,改为下面这种格式:spa

if (convertView==null) {
	convertView = inflater.inflate(R.layout.item_table, null);
}
TextView tv1 = (TextView) convertView.findViewById(R.id.tv_1);
TextView tv2 = (TextView) convertView.findViewById(R.id.tv_2);
tv1.setText("test");
...
return convertView;

固然,运行效果是同样的,但由于每次都用了findViewById,效率确定会有些影响。.net

因此谷歌才会鼓励ViewHolder的写法:code

ViewHolder holder = null;
if (convertView==null) {
	convertView = inflater.inflate(R.layout.item_table, null);
	holder.tv1 = (TextView) convertView.findViewById(R.id.tv_1);
	holder.tv2 = (TextView) convertView.findViewById(R.id.tv_2);
}else {
	holder = (ViewHolder) convertView.getTag();
}
holder.tv1.setText("test");
...
return convertView;

这种写法的好处显而易见,将convertView中的View以ViewHolder的实例存入tag中复用,从而减小findViewById的调用,避免了资源浪费。(findViewById每次都会建立一个新的实例blog


虽然ViewHolder能提升执行效率,但实际运行的效果并没有太大差异,而且每一个Adapter都要写多一个ViewHolder类,烦的要死,这也是致使我放弃ViewHolder的缘由。资源

因而,下面推荐你们看看ViewHolder的另外一种写法:get

http://my.oschina.net/jack1900/blog/289164 it

用这个ViewHolder无需每次都写多一个类,只需这样:table

if (convertView==null) {
	convertView = inflater.inflate(R.layout.item_table, null);
}
TextView tv1 = ViewHolder.get(convertView, R.id.tv_1);
TextView tv2 = ViewHolder.get(convertView, R.id.tv_2);
tv1.setText("test");
...
return convertView;

真心好用!推荐你们也用这个~~class

相关文章
相关标签/搜索