Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android ListView 的優化

Android ListView 的優化

編輯:關於Android編程

一、復用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中的一個關鍵字,當用它來修飾成員變量時,那麼該變量就屬於該類,而不是該類的實例。所以用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、對不同的狀態進行處理:

分批加載數據,只關心靜止狀態:關心最後一個可見的條目,如果最後一個可見條目就是數據適配器(集合)裡的最後一個,此時可加載更多的數據。在每次加載的時候,計算出滾動的數量,當滾動的數量大於等於總數量的時候,可以提示用戶無更多數據了。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved