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裡面的控件,定義成一個類。