天天看點

使用converView/viewHolder優化ListView

BaseAdapter裡面有一個public View getView(int position, View convertView, ViewGroup parent) {

View view = null;

view=new View();

return view;

}方法

而在ListView滑動的過程中 很容易就會發現每次getView被執行 都會new出一個View對象 長此以往會産生很大的消耗 

特别當item中還有Bitmap等 甚至會造成OOM的錯誤導緻程式崩潰

在看getView提供的參數時 可能已經注意到了 有一個參數View convertView 而這個convertView其實就是最關鍵的部分了 原理上講 

當ListView滑動的過程中 會有item被滑出螢幕 而不再被使用 這時候Android會回收這個條目的view 

這個view也就是這裡的convertView

在上面的做法中 當item1被移除螢幕的時候 我們會重新new一個View給新顯示的item_new 而如果使用了這個convertView 我們其實可以複用它 

這樣就省去了new View的大量開銷

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

View view = null;

if (convertView != null) {

view = convertView;

//複用了回收的view 隻需要直接作内容填充的修改就好了

} else {

view = new View(或者在布局檔案裡面加載);

//沒有供複用的view 按一般的做法建立view

}

return view;

}

當我們的ListView中填充的item有多種形式時 比如微網誌中 有的item中包含圖檔 有的item包含視訊 那麼必然的 

我們需要用到2種item的布局方式

此時如果隻是單純判斷convert是否存在 會造成回收的view不符合你目前需要的布局 而類似轉換失敗出錯退出

這裡要提到Adapter中的另外2個方法:

public int getItemViewType(int position) {}

public int getViewTypeCount() {}

ViewHolder其實是每一個Item裡面的控件,定義成一個類。

繼續閱讀