Android ListView 的最佳化

來源:互聯網
上載者:User

標籤:nbsp   執行個體   緩衝   使用者   系統   view   為我   目的   hang   

一、複用convertView,降低findViewById的次數

1、最佳化一:複用convertView

Android系統本身為我們考慮了ListView的最佳化問題。在複寫的Adapter的類中,比較重要的兩個方法是getCount()和getView()。介面上有多少個條顯示。就會調用多少次的getView()方法;因此假設在每次調用的時候,假設不進行最佳化。每次都會使用View.inflate(….)的方法,都要將xml檔案解析,並顯示到介面上,這是很消耗資源的:由於有新的內容產生就會有舊的內容銷毀,所以。能夠複用舊的內容。

最佳化:

在getView()方法中。系統就為我們提供了一個複用view的曆史緩衝對象convertView。當顯示第一屏的時候。每個item都會新建立一個view對象,這些view都是能夠被複用的;假設每次顯示一個view都要建立一個。是很耗費記憶體的。所以為了節約記憶體。能夠在convertView不為null的時候。對其進行複用

2、最佳化二:緩衝item條目的引用——ViewHolder

    findViewById()這種方法是比較耗效能的操作,由於這種方法要找到指定的布局檔案,進行不斷地解析每一個節點:從最頂端的節點進行一層一層的解析查詢,找到後在一層一層的返回,假設在左邊沒找到。就會接著解析右邊。並進行對應的查詢。直到找到位置()。因此能夠對findViewById進行最佳化處理,須要注意的是:

》》》》特點:xml檔案被解析的時候,僅僅要被建立出來了,其孩子的id就不會改變了。依據這個特點。能夠將孩子id存入到指定的集合中,每次就能夠直接取出集合中相應的元素就能夠了。

最佳化:

在建立view對象的時候。降低布局檔案轉化成view對象的次數;即在建立view對象的時候,把所有孩子所有找到,並把孩子的引用給存起來

①定義儲存控制項引用的類ViewHolder

這裡的ViewHolder類須要不須要定義成static,依據實際情況而定,假設item不是非常多的話,能夠使用,這樣在初始化的時候。僅僅載入一次。能夠略微得到一些最佳化

只是,假設item過多的話。建議不要使用。由於static是Java中的一個keyword,當用它來修飾成員變數時,那麼該變數就屬於該類,而不是該類的執行個體。所以用static修飾的變數。它的生命週期是非常長的。假設用它來引用一些資源耗費過多的執行個體(比方Context的情況最多)。這時就要盡量避免使用了。

    class ViewHolder{

                      //定義item中對應的控制項

             }

②建立自己定義的類:ViewHolder holder = null;

③將子view加入到holder中:

在建立新的listView的時候。建立新的ViewHolder。把所有孩子所有找到,並把孩子的引用給存起來

通過view.setTag(holder)將引用設定到view中

通過holder。將孩子view設定到此holder中。從而降低以後查詢的次數

④在複用listView中的條目的時候。通過view.getTag(),將view對象轉化為holder。即轉化成對應的引用,方便在下次使用的時候存入集合。

  通過view.getTag(holder)擷取引用(須要強轉)

二、ListView中資料的分批及分頁載入:

需求:ListView有一萬條資料,怎樣顯示;假設將十萬條資料載入到記憶體,非常消耗記憶體

解決的方法:

最佳化查詢的資料:先擷取幾條資料顯示到介面上

進行分批處理---à最佳化了使用者體驗

進行分頁處理---à最佳化了記憶體空間

說明:

一般資料都是從資料庫中擷取的,實現分批(分頁)載入資料,就須要在相應的DAO中有相應的分批(分頁)擷取資料的方法。如findPartDatas ()

1、準備資料:

    在dao中加入分批載入資料的方法:findPartDatas ()

    在適配資料的時候,先載入第一批的資料,須要載入第二批的時候,設定監聽檢測何時載入第二批

2、設定ListView的滾動監聽器:setOnScrollListener(new OnScrollListener{….})

①、在監聽器中有兩個方法:滾動狀態發生變化的方法(onScrollStateChanged)和listView被滾動時調用的方法(onScroll)

②、在滾動狀態發生改變的方法中,有三種狀態:

手指按下移動的狀態:                          SCROLL_STATE_TOUCH_SCROLL:// 觸摸滑動

慣性滾動(滑翔(flgin)狀態):   SCROLL_STATE_FLING: // 滑翔

精巧狀態:                                          SCROLL_STATE_IDLE:// 精巧

3、對不同的狀態進行處理:

分批載入資料,僅僅關心精巧狀態:關心最後一個可見的條目,假設最後一個可見條目就是資料配接器(集合)裡的最後一個。此時可載入很多其它的資料。在每次載入的時候,計算出滾動的數量,當滾動的數量大於等於總數量的時候。能夠提示使用者無很多其它資料了。

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.