Adapter是listview和數據源間的中間人,當每條數據進入可見區域時,adapter的getview()會被調用,返回代表具體數據的視圖;觸摸滾動時,頻繁調用;支持成百上千條數據。既然是大量數據,就會使用到很多佈局,給佈局綁定數據,listview將佔用大量資源還可能會產生卡頓現象。
效果如下:
下面來看看代碼:
1.利用convertview回收視圖,效率提高
200
%。
if (convertView == null) {
view = layoutInflater.inflate(R.layout.item, null);
holder = new ViewHolder();
holder.imgIcon = (ImageView) view.findViewById(R.id.img_icon);
holder.txtTitle = (TextView) view.findViewById(R.id.txt_title);
holder.txtContent = (TextView) view.findViewById(R.id.txt_content);
holder.txtNum = (TextView) view.findViewById(R.id.txt_num);
view.setTag(holder);
} else {
view = convertView;
holder = (ViewHolder) view.getTag();
}
2.
利用viewholder模式,效率在提高
50
%
static class ViewHolder {
ImageView imgIcon;
TextView txtTitle,txtContent,txtNum;
}
在Adapter的代碼中,在getView方法裏首先判斷convertView是否爲空,若爲空則加載相應佈局,若不爲空則直接
使用該佈局,這能夠很有效的使用Android爲listview提供的緩存機制:只加載一屏的佈局,之後滑動出來的item使
用的是之前已經加載的佈局的緩存;而使用靜態的ViewHoulder的目的則是節省了findViewById的時間。如果不使
用ViewHolder,每次getView的時候都需要得到一次子佈局,而這也是很耗時並且耗資源的;如果使用了
ViewHolder作爲子佈局的緩存,使用View的setTag方法將緩存與每個item綁定,則也可以省去了findViewById的
事件;而將ViewHolder設置爲static的目的是指在初始化Adapter時初始化一次這個內部類,否則將會在每次創建
Adapter時都要初始化一次,而這是沒有必要的。
ListView的優化也是面試中常問的問題,這裏總結一下:
1.convertView的複用,減少每次都去加載layout文件。
2.ViewHolder緩存item條目的引用,減少findviewbyid的次數。
3.要對數據進行分頁加載,item的佈局層級要越少越好,判斷手勢,快速滑動時不加載裏面的圖片,如果item中有圖片一定要用異步加載,而且裏面的圖片儘量要用縮略圖或者小圖。這樣分點列出,說明你是一個善於總結的人,能增加面試官對你的印象。
demo下載地址:http://download.csdn.net/detail/u014727709/9723931
轉載自:http://blog.csdn.net/u014727709/article/details/53911767
歡迎start,歡迎評論,歡迎指正