listView的優化

listView的優化:

view.inflate()這個操作是很耗時間跟內存的

如果listview上面有十個條目那麼系統會加載十一個條目的信息,每顯示新的條目都會創建新的一個條目.解決方案就是複用舊的被移除的對象,不用inflate()操作來產生新的對象,在google工程師給我們的getView的方法中有一個View converView這是一個歷吏的View對象,要複用文檔中說明了必須要判斷view不爲空,佈局複用的類型要合適.

1.判斷歷史緩存是view對象是否爲空,如果不爲空並且類型合適就可以複用這個歷史緩存的view對象

View view;

//這個顯示的條目是RalativeLayout相對佈局的

if(convertView != null && convertView instanceof RalativeLayout){

view = convertView;}else{

view = View.inflate(getapplicationContext(),R.layout.call_sms_item,null);}

 

view.findViewById()這個也是一個很耗時間跟內存的

因爲每次都要找控件的id這個是很費時,而且每次都在是方法中創建一個變量,如果調用次數上萬的話內存就有危險了而且每次方法調用都要變量釋放跟創建這也是消耗系統性能的,可以做以下的處理,

1.定義一個靜態內部類ViewHolder,在靜態內部中定義控件的引用

2.在else中新創建顯示條目中把這個類進行負值然後通過view.setTag(holder);在創建新佈局的時候,獲取到佈局裏面的控件的引用,存放到當前的view對象裏面

3.在使用緩存view對象的代碼中可以使用holder = (ViewHolder)view.getTag();//使用緩存view對象裏面的控件id的引用,目的減少查找控件的次數

4.下面的設置文本之類都可以用這個holder存的引用對象去設置

 

 

如果listView數據太多,會造成內存溢出,加載數據慢,現在處理是分批加載數據

1.dao中分頁查詢出數據,參數指定從第幾條數據開始,最大條數(一次最多獲取20條數據)

分頁SQL與mysql類似,下面SQL語句獲取5條記錄,跳過前面3條記錄

select * from Account limit 5 offset 3 或者 select * from Account limit 3,5

 

2.判斷用戶是否拖動到了界面的最下方,註冊一個監聽器

iv_call_sms_safe.setOnScrollListener(OnScrollListener);這個接口中有兩個方法一個是onScrollStateChanged(當listview的滾動狀態發生改變的時候調用,還有一個方法是onScroll(當listview在滾動的時候調用的方法)

 在onScrollStateChanged(AbsListView view,int scrollState)

view:當前滾動的listview對象

scrollState:滾動的狀態

OnScrollListener.SCROLL_STATE-IDLE;這個表示當前是靜止狀態

3.如果是靜止狀態,那麼我們就判斷在listView裏面最後一個用戶可見的條目是否是 listview數據適合器裏面最後一個條目

int postion = lv_call_sms_safe.getLastVisiblePosition();//得到最後一個用戶可見的條目這個是從零開始的

int maxitem = blacknumbers.size()//這個是數據適配器裏面有多少個條目,這個是從1開始的

4.我們就判斷我們見到的postion是否跟maxitem是否相同,如果相同就表示到了最後一個條目(用戶把界面拖動到了最下面)

5.就添加更多的數據,就是再加載20條數據

1>數據庫查出後20條記錄

2>查出來的記錄加入到適配器的集合中

3>更新界面

4>adapter.notifyDataSetChanged();

6.最後判斷數據庫多少條目,然後跟現在最後的條目是相等,相等說明已經全部顯示了

Cursor cursor = db.rawQuery("select * from blacknumber",null);

total = cursor.getCOunt();得到總記錄數

這個還要注意如果數據太多的話會導致內存溢出,就要考慮分頁的方法了

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章