編輯:關於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、對不同的狀態進行處理:
分批加載數據,只關心靜止狀態:關心最後一個可見的條目,如果最後一個可見條目就是數據適配器(集合)裡的最後一個,此時可加載更多的數據。在每次加載的時候,計算出滾動的數量,當滾動的數量大於等於總數量的時候,可以提示用戶無更多數據了。
Android Studio 1.0 已經放出來了,以後的Android平台開發激昂逐步從Eclipse向Android Studio遷移,為了能不落伍我也特意從Goog
TextView與EditText詳解TextView 顧名思義:就是在界面上呈現文本信息,主要用於顯示,沒有特殊的事件響應。然而EditText與TexVi
從上周把android ACHartEnginee的源碼check out出來後就一直在看這個東西是如何使用的,以及底層是如何實現的,把最近一周對這個東西的了解先發上來,
簡介KVO是一套當目標對象的屬性值改變時觀察者對象能夠接受到通知的機制。必須先理解KVC才能更好的理解KVO,前者是後者的實現基礎。這樣的通信機制在MVC設計模式很是常見