Android - ListView的優(yōu)化

ListView在應(yīng)用中使用極為廣泛,為了使ListView的滑動(dòng)流暢,性能優(yōu)化是必不可少的操作。在此提出三點(diǎn)優(yōu)化方案。

優(yōu)化的主要操作,其實(shí)是在Adapter中進(jìn)行優(yōu)化。首先看看最常規(guī)的寫法,代碼如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = getLayoutInflater().inflate(R.layout.item_layout,null);
    TextView text = view.findViewById(R.id.text);
    text.setText(data.get(position).toString);       
    return view;
}

這是最常規(guī)的寫法,獲取到Item的view,并獲取到view中的控件TextView,將其賦值,并返回view。
那么問題來了,如果item條目非常多,成百上千條,那么就得獲取成百上千次view,和成百上千次TextView。這樣做顯然是無用功,嚴(yán)重消耗內(nèi)存。優(yōu)化方案如下:

1. 重復(fù)使用Item布局

在getView方法中,第二個(gè)參數(shù)convertView,其實(shí)就是指item的view。所以我們并不需要為每個(gè)item都創(chuàng)建一個(gè)view,重復(fù)使用這個(gè)convertView就行了。優(yōu)化代碼如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    if (convertView == null ){
        view = getLayoutInflater().inflate(R.layout.item_layout,null);
    } else {
        view = convertView;//直接復(fù)用convertView
    }
    TextView text = view.findViewById(R.id.text);
    text.setText(data.get(position).toString);       
    return view;
}
2. 重復(fù)使用Item 布局中的控件

在方案1中,雖然避免了重復(fù)創(chuàng)建了View,但仍然是重復(fù)的獲取TextView,即重復(fù)調(diào)用findViewById的方法。其實(shí)每個(gè)Item的TextView也是相同的,所以我們也需要想辦法將它復(fù)用,于是便有了ViewHolder這個(gè)玩意。優(yōu)化代碼如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    ViewHolder holder;
    if (convertView == null ){
        view = getLayoutInflater().inflate(R.layout.item_layout,null);
        holder = new ViewHolder;
        holder.textView = view.findViewById(R.id.text);
        view.setTag(holder);//將holder和view綁定
    } else {
        view = convertView;//直接復(fù)用convertView
        holder = view.getTag;//取出holder,達(dá)到復(fù)用TextView的效果
    }
    holder.text.setText(data.get(position).toString);       
    return view;
}

class ViewHolder{
    TextView textView;
}
3. ListView 分頁加載。

當(dāng)需要顯示的數(shù)據(jù)條目非常多時(shí),我們?nèi)绻麑⑵淙揩@取并顯示,不僅耗時(shí),而且整個(gè)list會(huì)特別長,此時(shí)肯定會(huì)造成ListView的滑動(dòng)卡頓,這樣設(shè)計(jì)肯定是不合理的,我們可以使用分頁加載的方式,只加載部分?jǐn)?shù)據(jù),當(dāng)用戶滑到最后一項(xiàng)時(shí),繼續(xù)加載下一頁數(shù)據(jù),這樣就會(huì)輕快很多。具體的代碼實(shí)現(xiàn):

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容