BaseAdapter優化


本節引言:

上一節我們學習如何來使用一個ListView以及自訂一個簡單的BaseAdapter,我們從程式碼 中可以看出比較重要的兩個方法:getCount()和getView(),介面上有多少列就會呼叫多少次getView, 這時候可能看出一些端倪,每次都是新inflate一個View,都要進行這個XML的解析,這樣會 很浪費資源,當然,幾十列或幾百列的清單並不能反映什麼問題,但假如更多或佈局更加複雜? 所以學習ListView的最佳化很重要,而本節針對的是BaseAdapter的最佳化,優化的兩點有,重複使用convertView 以及使用ViewHolder重用元件,不用每次都findViewById,我們具體透過程式碼來體會吧!


1.重複使用ConvertView:

上面也說了,介面上有多少個Item,那麼getView方法就會被呼叫幾次! 讓我們來看看上一節我們寫的getView()部分的程式碼:

@Override
public View getView(int position, View convertView, ViewGroup parent) {








#    convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
    Image  TextView txt_aName = ( TextView) convertView.findViewById(R.id.txt_aName);
    TextView txt_aSpeak = (TextView) convertView.findViewById(R.id getaIcon());
    txt_aName.setText(mData.get(position).getaName());###    _aSpeak.setText(mData.get(position). ##}######

是吧,inflate()每次都要載入一次xml,其實這個convertView是系統提供給我們的可供服用的View 的快取對象,那就坐下判斷咯,修改下,優化後的程式碼:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if(convertView == null){
        convertView = LayoutInflater.from(mContext).inflate ageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
    TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName); ById(R. id.txt_aSpeak);

    img_icon.setBackgroundResource(mData.get(position).getaIcon());
    txt_aName.setText(mData.get(position).getaName()); .setText(mData.get(position).getaSpeak());
    return convertView;
}


2.ViewHolder重複使用元件

嘿嘿,getView()會被呼叫多次,那麼findViewById不一樣得呼叫多次,而我們​​的ListView的Item 一般都是一樣的佈局,我們可以對這裡在最佳化下,我們可以自己定義一個ViewHolder類別來對這一部分 進行效能優化!修改後的程式碼如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolderholder parent) {
    ViewHolderholder parent) {
    ViewHolderholder parent) {
 convertView == null){
        convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal, 長      holder.img_icon = (ImageView ) convertView.findViewById(R.id.img_icon);
        holder.txt_aName = (TextView) convertView.findViewById convertView.findViewById(R.id .txt_aSpeak);
        convertView.setTag(holder);   //將Holder儲存至convertView
    }  }
    holder .img_icon.setBackgroundResource(mData.get(position).getaIcon());
    holder.txt_aName.setText(mData.get(position).getaName());
  (position).getaSpeak());
    return convertView;
}

static class ViewHolder{
    ImageView }



沒錯就是這麼簡單,你以後BaseAdapter照著這個模板寫就對了,哈哈,另外這個修飾ViewHolder的 static,關於是否定義成靜態,跟裡面的物件數目是沒有關係的,加靜態是為了在多個地方使用這個 Holder的時候,類別只需載入一次,如果只是使用了一次,加不加也沒所謂! ——
Berial(B神)原話~

本節小結:

好的,關於BaseAdapter的最佳化大概就上述的兩種,非常簡單,重複使用ConvertView以及自訂ViewHolder 減少findViewById()的呼叫~如果你有其他關於BaseAdapter優化的建議歡迎提出,謝謝~