ListView 絕對可以稱得上是Android中最常用的控件之一,幾乎所有的程序都會用到它樟澜。要學(xué)好ListView瞳收,不但要學(xué)習(xí)如何使用它,還要學(xué)習(xí)怎么用好它猴伶。下面寫的內(nèi)容主要是圍繞如何優(yōu)化listview的運行效率课舍。
1. 利用getview()方法中的convertView參數(shù)進行優(yōu)化
在ListView滑動的過程中塌西,很容易就會發(fā)現(xiàn)每次getView()被執(zhí)行都會new出一個View對象 長此以往會產(chǎn)生很大的消耗 ,特別當(dāng)item中還有Bitmap等 甚至?xí)斐蒓OM的錯誤導(dǎo)致程序崩潰筝尾。
利用convertView參數(shù)可以將之前加載好的布局進行緩存捡需,以便之后可以進行重用。我們可以在getview()方法中進行判斷筹淫,如果convertview為null站辉,則使用layoutinflater去加載布局,如果不為null則直接對convertView進行重用损姜。原理上來講就是饰剥,當(dāng)ListView滑動的過程中會有item被滑出屏幕,不再被使用薛匪。這時候Android會回收這個條目的view捐川,這個view也就是這里的convertView,使屏幕中始終保持只有幾個逸尖。
2. 利用ViewHolder進行優(yōu)化
在Adapter中新增一個內(nèi)部類ViewHolder古沥,用于進行實例的緩存。當(dāng)convertview為null 的時候娇跟,創(chuàng)建一個ViewHolder對象岩齿。并將控件的實例都存放在ViewHolder里,然后把ViewHolder存放在View中苞俘。當(dāng)convertview不為null的時候盹沈,調(diào)用view中的gettag方法把viewholder,就沒必要通過findbyid(0獲取控件實例了吃谣。
使用了以上這兩種方法進行優(yōu)化之后乞封,listview的運行效率已經(jīng)就非常不錯了。
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter( Context context, int resource, List<Fruit> objects) {
super(context, resource, objects);
this.resourceId = resource;
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position); //獲取當(dāng)前項的Fruit實例
View view;
ViewHolder viewHodler;
if(convertView==null){ // 優(yōu)化:不會重復(fù)加載布局
view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
viewHodler = new ViewHolder(); //優(yōu)化:不會重復(fù)調(diào)用findviewbyid方法獲取控件
viewHodler.fruitName = (TextView) view.findViewById(R.id.Name);
view.setTag(viewHodler); //將ViewHolder存在View中
}
else{
view =convertView;
viewHodler = (ViewHolder) view.getTag();
}
viewHodler.fruitName.setText(fruit.getName());
return view;
}
class ViewHolder{
TextView fruitName;
}
}