Android BaseAdapter優(yōu)化

2023-03-31 13:42 更新

本節(jié)引言:

上一節(jié)中我們學(xué)習(xí)了如何來使用一個ListView以及自定義一個簡單的BaseAdapter,我們從代碼 中可以看出比較重要的兩個方法:getCount()和getView(),界面上有多少列就會調(diào)用多少次getView, 這個時候可能看出一些端倪,每次都是新inflate一個View,都要進行這個XML的解析,這樣會 很浪費資源,當(dāng)然,幾十列或者幾百列的列表并不能體現(xiàn)什么問題,但假如更多或者布局更加復(fù)雜? 所以學(xué)習(xí)ListView的優(yōu)化很重要,而本節(jié)針對的是BaseAdapter的優(yōu)化,優(yōu)化的兩點有,復(fù)用convertView 以及使用ViewHolder重用組件,不用每次都findViewById,我們具體通過代碼來體會吧!


1.復(fù)用ConvertView:

上面也說了,界面上有多少個Item,那么getView方法就會被調(diào)用多少次! 我們來看看上一節(jié)我們寫的getView()部分的代碼:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
    ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
    TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
    TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);

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

是吧,inflate()每次都要加載一次xml,其實這個convertView是系統(tǒng)提供給我們的可供服用的View 的緩存對象,那就坐下判斷咯,修改下,優(yōu)化后的代碼:

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

    if(convertView == null){
        convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
    }

    ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
    TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
    TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);

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

2.ViewHolder重用組件

嘿嘿,getView()會被調(diào)用多次,那么findViewById不一樣得調(diào)用多次,而我們的ListView的Item 一般都是一樣的布局,我們可以對這里在優(yōu)化下,我們可以自己定義一個ViewHolder類來對這一部分 進行性能優(yōu)化!修改后的代碼如下:

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

static class ViewHolder{
    ImageView img_icon;
    TextView txt_aName;
    TextView txt_aSpeak;
}

沒錯就是這么簡單,你以后BaseAdapter照著這個模板寫就對了,哈哈,另外這個修飾ViewHolder的 static,關(guān)于是否定義成靜態(tài),跟里面的對象數(shù)目是沒有關(guān)系的,加靜態(tài)是為了在多個地方使用這個 Holder的時候,類只需加載一次,如果只是使用了一次,加不加也沒所謂!——Berial(B神)原話~


本節(jié)小結(jié):

好的,關(guān)于BaseAdapter的優(yōu)化大概就上述的兩種,非常簡單,復(fù)用ConvertView以及自定義ViewHolder 減少findViewById()的調(diào)用~如果你有其他關(guān)于BaseAdapter優(yōu)化的建議歡迎提出,謝謝~

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號