2019独角兽企业重金招聘Python工程师标准>>>
第一次学ListView基本是半懂,adapter也是看着别人的代码打一遍硬生生记下来的,以至于一直不怎么懂ViewHolder的作用。
到后来学有小成后,自作聪明的放弃了ViewHolder的写法,改成下面这种格式:
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,效率肯定会有些影响。
所以谷歌才会鼓励ViewHolder的写法:
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每次都会创建一个新的实例)
虽然ViewHolder能提高执行效率,但实际运行的效果并无太大差别,并且每个Adapter都要写多一个ViewHolder类,烦的要死,这也是导致我放弃ViewHolder的原因。
于是,下面推荐大家看看ViewHolder的另一种写法:
http://my.oschina.net/jack1900/blog/289164
用这个ViewHolder无需每次都写多一个类,只需这样:
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;
真心好用!推荐大家也用这个~~