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