ListView的幾種常見的優化方法(二)

優化二: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左右。

相關文章
相關標籤/搜索