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());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);
是吧,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;
}
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神)原話~
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優化的建議歡迎提出,謝謝~