【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

相關文章
相關標籤/搜索