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; 判斷是否滑到底部的標記
private int mPageNum = 1; private boolean isBottom; -
設置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的用法
-
使用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)的疑問
-
為什么不把加載數(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圖 -
當ListView到達底部的時候,服務器沒有更多數(shù)據(jù)可以加載。
- 繼續(xù)用手指滑動屏幕
- 因為沒有更多數(shù)據(jù),所以屏幕ListView不會動
- 這個時候:
onScrollStateChanged方法會執(zhí)行,但是onScroll方法不會執(zhí)行
