我有篇博客教大家如何利用 convertView 以及 viewHolder(static) 改善 ListView 卡頓情況;但是在 ListView 加載大量複雜佈局和圖片的時候,即使使用了 convertView 和 viewHolder,ListView還是卡頓,本文主要討論瞭如何在加載複雜 list_item 同時保證 ListView 流暢性。
核心思想是
監聽滑動據加載,異步加載數據。
getView 函數一定不能耗時,有耗時任務要異步加載。
主要的方法:
先判斷當前 ListView 的狀態,只有 ListView 停止滑動纔開啓新線程加載數據,其他狀態均忽略。
使用 getFirstVisiblePosition 和 getLastVisiblePosition 方法來顯示 item。
耗時任務一定不要在 getView 方法中進行,最好異步進行。
具體代碼如下:
//1. 判斷listView狀態 AbsListView.OnScrollListener onScrollListener = new AbsListView.OnScrollListener() {// ListView // 觸摸事件 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { case AbsListView.OnScrollListener.SCROLL_STATE_FLING:// 滑動狀態 threadFlag = false; break; case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 停止 threadFlag = true; startThread();//開啓新線程,加載數據 break; case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 觸摸listView threadFlag = false; break; default: // Toast.makeText(contextt, "default", // Toast.LENGTH_SHORT).show(); break; } } };
相信做到以上三點,就能運用自如的使用 ListView了,O(∩_∩)O哈哈~
ListView優化彙總:
1、UI優化:
listview條目與條目之間的間隙的分割內容 : android:divider="@android :color/transparent"
listview條目之間的間隙 : android:paddingTop="5.0dip"
listview點中的顏色變化 : android:listSelector="@color/transparent"
如果listview有很多個條目 ,在listview的右邊 會顯示出來一個快速滾動的進度條 : android:fastScrollEnabled="true"(listview裏面的條目至少要滾動5個屏幕以上)
android:scrollbarStyle="outsideOverlay"
android:scrollbars="none"
footer view
header view
快速拖動時候的懸浮提示(window manager)
2、數據適配性能優化:
a.傳統方式:
複用歷史緩存的view對象, convertView 減少 採用佈局填充器服務 填充佈局的次數,達到減少xml->view 操作的次數.
定義了靜態的viewholder 儲存了 view對象裏面控件的引用, view.setTag() view.getTag(); 減少遍歷view對象 樹狀結構的次數.
b.採用了內存緩存,緩存一些經常使用的數據:
服務器上的圖片,緩存這些圖片,(緩存手機的Rom卡,sd卡)利用softreference把圖片給緩存到內存裏面;
再比如緩存從數據庫中查詢出的所有數據,減少查詢數據庫的動作
c.高級需求:
listview的延時加載:
如果listview裏面要顯示的有很多的數據, 我們不需要一次把所有的數據都獲取出來.
分段的方式 一段一段的把數據下載下來.
註冊listview的 onScrollListener(); 發現最後一個可見的條目 爲listview裏面數據適配器裏面的最後的一個條目, 加載更多的內容.
listview的分頁顯示:
服務器需要提供接口, 一次獲取一段的數據.
數據庫提供接口 ,一次查詢一段的數據.
listview的快速拖動的問題:
當listview在滾動狀態下,不去加載listview裏面真實的圖片和內容,而是把一個縮略圖加載界面上.
當listview的滾動狀態停止的時候 纔去真正的更新裏面的條目的內容.
如何讓你的ListView實現自動滾動呢? Android其實已經考慮到ListView控件的智能滾動操作。直接在Layout中寫即可,注意下面的stackFromBottom以及transcriptMode這兩個屬性。