Android ListView 優化最佳實踐

有篇博客教大家如何利用 convertView 以及 viewHolder(static) 改善 ListView 卡頓情況;但是在 ListView 加載大量複雜佈局和圖片的時候,即使使用了 convertView 和 viewHolder,ListView還是卡頓,本文主要討論瞭如何在加載複雜 list_item 同時保證 ListView 流暢性。

核心思想是

監聽滑動據加載,異步加載數據。

getView 函數一定不能耗時,有耗時任務要異步加載。

主要的方法:

  1. 先判斷當前 ListView 的狀態,只有 ListView 停止滑動纔開啓新線程加載數據,其他狀態均忽略。

  2. 使用 getFirstVisiblePosition 和 getLastVisiblePosition 方法來顯示 item。

  3. 耗時任務一定不要在 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這兩個屬性。


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