Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 面試之listview

android 面試之listview

編輯:關於Android編程

ListView優化一直是一個老生常談的問題,不管是面試還是平常的開發中,ListView永遠不會被忽略掉,那麼這篇文章我們來看看如何最大化的優化ListView的性能。· 1.在adapter中的getView方法中盡量少使用邏輯· 2.盡最大可能避免GC· 3.滑動的時候不加載圖片· 4.將ListView的scrollingCache和animateCache設置為false· 5.item的布局層級越燒越好· 6.使用ViewHolder1.在adapter中的getView方法中盡量少使用邏輯不要在你的getView()中寫過多的邏輯代碼,我們可以將這些代碼放在別的地方,例如:
public View getView(int position, View convertView, ViewGroup parent) {
View item = mInflater.inflate(R.layout.list_item_icon_text, null);
((TextView) item.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return item;
}
怎麼樣?如果超過1000000項時,後果不堪設想!您可千萬別這麼寫!
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, null);
}
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
那麼上面的代碼還可以優化嗎,答案是肯定的。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
  
static class ViewHolder {
TextView text;
ImageView icon;
}

2.GC 垃圾回收器當你創建了大量的對象的時候,GC就會頻繁的執行,所以在getView()方法中不要創建很多的對象,最好的優化是,不要在ViewHolder以外創建任何對象,如果你的你的log裡面發現“GC has freed some memory”頻繁出現的話,那你的程序肯定有問題了。你可以檢查一下:a) item布局的層級是否太深b) getView()方法中是否有大量對象存在c) ListView的布局屬性3.加載圖片如果你的ListView中需要顯示從網絡上下載的圖片的話,我們不要在ListView滑動的時候加載圖片,那樣會使ListView變得卡頓,所以我們需要再監聽器裡面監聽ListView的狀態,如果滑動的時候,停止加載圖片,如果沒有滑動,則開始加載圖片
listView.setOnScrollListener(new OnScrollListener() {
 @Override
public void onScrollStateChanged(AbsListView listView,
int scrollState) { //停止加載圖片
if (scrollState ==
AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
imageLoader.stopProcessingQueue();
} else { //開始加載圖片
imageLoader.startProcessingQueue();
}
} @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
// TODO Auto-generated method stub
}
});

4.將ListView的scrollingCache和animateCache設置為falsescrollingCache: scrollingCache本質上是drawing cache,你可以讓一個View將他自己的drawing保存在cache中(保存為一個bitmap),這樣下次再顯示View的時候就不用重畫了,而是從cache中取出。默認情況下drawing cahce是禁用的,因為它太耗內存了,但是它確實比重畫來的更加平滑。而在ListView中,scrollingCache是默認開啟的,我們可以手動將它關閉。animateCache: ListView默認開啟了animateCache,這會消耗大量的內存,因此會頻繁調用GC,我們可以手動將它關閉掉,所以我們代碼可以這麼寫:



5.減少item的布局的深度我們應該盡量減少item布局深度,因為當滑動ListView的時候,這回直接導致測量與繪制,因此會浪費大量的時間,所以我們應該將一些不必要的布局嵌套關系去掉。減少item布局深度,這個我曾經做過一個實驗,當布局嵌套超過5層的時候,Android的Decodview就會出現錯誤,所以請不要嵌套的太深。   6.使用ViewHolder這個大家應該非常熟悉了,但是不要小看這個ViewHolder,它可以大大提高我們ListView的性能ListView的優化我們已經講完了。   以上是最基本的,如果你還有更好的方案補充,歡迎後面留言
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved