標籤: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 的最佳化