ListView分頁加載數(shù)據(jù)小結

ListView分頁加載數(shù)據(jù)小結

效果描述

分頁:當用戶在ListView界面上的時候不會加載全部的數(shù)據(jù),而是從服務端加載一部分數(shù)據(jù),當用戶滑動ListView到末端的時候再從服務器加載更多數(shù)據(jù)。即:我們在使用新聞app的時候滑到底部才會加載新的內容。

接口介紹:OnScrollListener

// 靜態(tài)屬性
public static int SCROLL_STATE_IDLE = 0; // 空閑狀態(tài)
public static int SCROLL_STATE_TOUCH_SCROLL = 1; // 滾動狀態(tài),并且手指在屏幕上
public static int SCROLL_STATE_FLING = 2;    //    滾動狀態(tài),手指已經離開了屏幕

// 抽象方法
public void onScrollStateChanged(AbsListView view, int scrollState); 
// ListView在狀態(tài)改變的時候調用,用戶在正?;瑒拥臅r候通常會執(zhí)行三次(刻意滑動當listView停止的時候才將手離開屏幕執(zhí)行兩次)

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount); 
// ListView在滾動的時候會反復調用該方法,調用次數(shù)和listView的子項無關(屏幕只要滑動一點就會調用)

關鍵代碼

  1. 設置成員屬性:分頁頁碼,默認1; 判斷是否滑到底部的標記

     private int mPageNum = 1;
     private boolean isBottom;
    
  2. 設置LIstView滑動監(jiān)聽器

     mNewsListView.setOnScrollListener(new OnScrollListener() {
    
         @Override
         public void onScrollStateChanged(AbsListView view, int scrollState) {
             if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                 if (isBottom) {
                     // 下載更多數(shù)據(jù)
                     Toast.makeText(MainActivity.this, "正在加載",
                             Toast.LENGTH_SHORT).show();        
                     //加載數(shù)據(jù)的方法代碼.......
                     //這里面的代碼通常是根據(jù)mPageNum加載不同的數(shù)據(jù)
                     // 對mPageNum處理: mPageNum++
                 
                 }
             }
         }
    
         @Override
         public void onScroll(AbsListView view, int firstVisibleItem,
                 int visibleItemCount, int totalItemCount) {
             if (firstVisibleItem + visibleItemCount == totalItemCount) {
                 // 說明:
                 // fistVisibleItem:表示劃出屏幕的ListView子項個數(shù)
                 // visibleItemCount:表示屏幕中正在顯示的ListView子項個數(shù)
                 // totalItemCount:表示ListView子項的總數(shù)    
                 // 前兩個相加==最后一個說明ListView滑到底部
                 isButtom = true;
             }else{
                 isButtom = false;
             }
         }
     });
    

mPageNum的用法

  1. 使用url獲取數(shù)據(jù)

         String baseUrl = "http://litchiapi.jstv.com/";
         String newsUrl = "/api/GetFeeds?column=%d&PageSize=20&pageIndex=%d&val=100511D3BE5301280E0992C73A9DEC41";
         String url =  baseUrl + String.format(newsUrl, column, mPageNum++);
         
     column,mPageNum會分別替換newsUrl中的兩個%d
    

可能出現(xiàn)的疑問

  1. 為什么不把加載數(shù)據(jù)的代碼寫在onScroll()方法內,這樣就可以省去一個成員變量:isBottom

         @Override
         public void onScroll(AbsListView view, int firstVisibleItem,
                 int visibleItemCount, int totalItemCount) {
             if (firstVisibleItem + visibleItemCount == totalItemCount) {
                 //加載更多數(shù)據(jù)
             }else{
                 //不記載新數(shù)據(jù)
             }
         }
    

    個人測試結果:由于onScroll執(zhí)行次數(shù)是不可控的,當listView在滑動到底部的時候,onScroll在滿足加載新數(shù)據(jù)條件的瞬間執(zhí)行了很多次,從而加載了很多暫時不需要的數(shù)據(jù)。

    ListViewLog圖
  2. 當ListView到達底部的時候,服務器沒有更多數(shù)據(jù)可以加載。

    • 繼續(xù)用手指滑動屏幕
    • 因為沒有更多數(shù)據(jù),所以屏幕ListView不會動
    • 這個時候:onScrollStateChanged方法會執(zhí)行,但是onScroll方法不會執(zhí)行
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容