[Android最佳化進階] 提高ListView效能的技巧,androidlistview

來源:互聯網
上載者:User

[Android最佳化進階] 提高ListView效能的技巧,androidlistview
ListView最佳化一直是一個老生常談的問題,不管是面試還是平常的開發中,ListView永遠不會被忽略掉,那麼這篇文章我們來看看如何最大化的最佳化ListView的效能。

  • 1.在adapter中的getView方法中盡量少使用邏輯
  • 2.盡最大可能避免GC
  • 3.滑動的時候不載入圖片
  • 4.將ListView的scrollingCache和animateCache設定為false
  • 5.item的布局層級越燒越好
  • 6.使用ViewHolder
1.在adapter中的getView方法中盡量少使用邏輯

不要在你的getView()中寫過多的邏輯代碼,我們可以將這些代碼放在別的地方,例如:

最佳化前的getView():

@Overridepublic View getView(int position, View convertView, ViewGroup paramViewGroup) {        Object current_event = mObjects.get(position);        ViewHolder holder = null;        if (convertView == null) {                holder = new ViewHolder();                convertView = inflater.inflate(R.layout.row_event, null);                holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);                holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);                convertView.setTag(holder);        } else {                holder = (ViewHolder) convertView.getTag();        }       //在這裡進行邏輯判斷,這是有問題的         if (doesSomeComplexChecking()) {                holder.ThreeDimention.setVisibility(View.VISIBLE);        } else {                holder.ThreeDimention.setVisibility(View.GONE);         }        // 這是設定image的參數,每次getView方法執行時都會執行這段代碼,這顯然是有問題的        RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);        holder.EventPoster.setLayoutParams(imageParams);        return convertView;}

最佳化後的getView():

@Overridepublic View getView(int position, View convertView, ViewGroup paramViewGroup) {    Object object = mObjects.get(position);    ViewHolder holder = null;    if (convertView == null) {            holder = new ViewHolder();            convertView = inflater.inflate(R.layout.row_event, null);            holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);            holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);            //設定參數提到這裡,只有第一次的時候會執行,之後會複用             RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);            holder.EventPoster.setLayoutParams(imageParams);            convertView.setTag(holder);    } else {            holder = (ViewHolder) convertView.getTag();    }    // 我們直接通過對象的getter方法代替剛才那些邏輯判斷,那些邏輯判斷放到別的地方去執行了    holder.ThreeDimension.setVisibility(object.getVisibility());    return convertView;}
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設定為false

scrollingCache: scrollingCache本質上是drawing cache,你可以讓一個View將他自己的drawing儲存在cache中(儲存為一個bitmap),這樣下次再顯示View的時候就不用重畫了,而是從cache中取出。預設情況下drawing cahce是禁用的,因為它太耗記憶體了,但是它確實比重畫來的更加平滑。而在ListView中,scrollingCache是預設開啟的,我們可以手動將它關閉。

animateCache: ListView預設開啟了animateCache,這會消耗大量的記憶體,因此會頻繁調用GC,我們可以手動將它關閉掉

最佳化前的ListView

<ListView        android:id="@android:id/list"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:cacheColorHint="#00000000"        android:divider="@color/list_background_color"        android:dividerHeight="0dp"        android:listSelector="#00000000"        android:smoothScrollbar="true"        android:visibility="gone" /> 

最佳化後的ListView

<ListView        android: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"        android:visibility="gone" />
5.減少item的布局的深度

我們應該盡量減少item布局深度,因為當滑動ListView的時候,這回直接導致測量與繪製,因此會浪費大量的時間,所以我們應該將一些不必要的布局嵌套關係去掉。減少item布局深度

6.使用ViewHolder

這個大家應該非常熟悉了,但是不要小看這個ViewHolder,它可以大大提高我們ListView的效能

ListView的最佳化我們已經講完了,如果在你的項目中,這些基本最佳化你還沒有做到的話,那麼你的ListView是有問題的,還有很大的提升潛力,以後再使用ListView的時候,一定要將這幾點考慮進去,發揮它的最大的效能。

著作權聲明:歡迎轉載,轉載請註明出處http://blog.csdn.net/nugongahou110

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.