android 面試之listview

來源:互聯網
上載者:User

標籤:

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() {
 @Overridepublic void onScrollStateChanged(AbsListView listView,int scrollState) { //停止載入圖片if (scrollState ==AbsListView.OnScrollListener.SCROLL_STATE_FLING) {imageLoader.stopProcessingQueue();} else { //開始載入圖片imageLoader.startProcessingQueue();}} @Overridepublic 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,我們可以手動將它關閉掉,所以我們代碼可以這麼寫:
<ListViewandroid:id="@android:id/list"android:layout_width="match_parent"android:layout_height="wrap_content"android:divider="@color/list_background_color"android:dividerHeight="0dp"android:listSelector="#00000000"android:scrollingCache="false"android:animationCache="false"android:smoothScrollbar="true" />

5.減少item的布局的深度我們應該盡量減少item布局深度,因為當滑動ListView的時候,這回直接導致測量與繪製,因此會浪費大量的時間,所以我們應該將一些不必要的布局嵌套關係去掉。減少item布局深度,這個我曾經做過一個實驗,當布局嵌套超過5層的時候,Android的Decodview就會出現錯誤,所以請不要嵌套的太深。
6.使用ViewHolder這個大家應該非常熟悉了,但是不要小看這個ViewHolder,它可以大大提高我們ListView的效能ListView的最佳化我們已經講完了。
以上是最基本的,如果你還有更好的方案補充,歡迎後面留言。或者加入我們的官方qq群:278792776













android 面試之listview

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.