優化二:ide
前面是對view對象的複用作的優化,咱們通過上面的優化以後,咱們不須要每個view都從新生成了。下面咱們來解決下一個每一次都須要作的工做,那就是view中組件的查找:優化
TextView tv_item = (TextView) view.findViewById(R.id.tv_item);this
實際上,findViewById是到xml文件中去查找對應的id,能夠想象若是組件多的話也是挺費事的,若是咱們可讓view內的組件也隨着view的複用而複用,那該是多美好的一件事啊。。實際上谷歌也推薦了一種優化方法來作應對,那就是從新建一個內部靜態類,裏面的成員變量跟view中所包含的組件個數類型相同,咱們這裏的view只包含了一個TextView,因此咱們的這個靜態類以下:code
private static class ViewHolder {xml
private TextView tvHolder;對象
}文檔
那麼這個viewHolder類咱們要如何使用才能夠達到複用效果呢?基本思路就是在convertView爲null的時候,咱們不只從新inflate出來一個view,而且還須要進行findviewbyId的查找工做,可是同時咱們還須要獲取一個ViewHolder類的對象,並將findviewById的結果賦值給ViewHolder中對應的成員變量。最後將holder對象與該view對象「綁」在一塊。get
當convertView不爲null時,咱們讓view=converView,同時取出這個view對應的holder對象,就得到了這個view對象中的TextView組件,它就是holder中的成員變量,這樣在複用的時候,咱們就不須要再去findViewById了,只須要在最開始的時候進行數次查找工做就能夠了。這裏的關鍵在於如何將view與holder對象進行綁定,那麼就須要用到兩個方法:setTag和getTag方法了:it
@Overrideio
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
// 判斷convertView的狀態,來達到複用效果
if (null == convertView) {
// 若是convertView爲空,則表示第一次顯示該條目,須要建立一個view
view = View.inflate(MainActivity.this, R.layout.listview_item,
null);
//新建一個viewholder對象
holder = new ViewHolder();
//將findviewbyID的結果賦值給holder對應的成員變量
holder.tvHolder = (TextView) view.findViewById(R.id.tv_item);
// 將holder與view進行綁定
view.setTag(holder);
} else {
// 不然表示能夠複用convertView
view = convertView;
holder = (ViewHolder) view.getTag();
}
// 直接操做holder中的成員變量便可,不須要每次都findViewById
holder.tvHolder.setText(list.get(position));
return view;
}
通過上面的作法,可能你們感受不太到優化的效果,根據Google的文檔,實際優化效果在百分之5左右。