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):