ListView的優化

       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,歡迎評論,歡迎指正

 

 

 

發佈了61 篇原創文章 · 獲贊 102 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章