第一次学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