参考博客:Android ListView分页加载(服务端+android端)Demo
监听OnScrollListener事件
class OnListScrollListener implements AbsListView.OnScrollListener{ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { /** * 当分页操作is_divPage为true时、滑动停止时、且pageNo<=4(这里因为服务端有4页数据)时,加载更多数据 */ if (is_divPage && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && mPageNo <=4) { // Toast.makeText(getActivity(), "正在获取更多数据...",Toast.LENGTH_SHORT).show(); new MyTask().execute(EMP_PATH+mPageNo); }else if (mPageNo >4) { /** * 如果pageNo>4则表示,服务端没有更多的数据可供加载了。 */ Toast.makeText(getActivity(), "没有更多数据啦...", Toast.LENGTH_SHORT).show(); } } /** * 当:第一个可见的item(firstVisibleItem)+可见的item的个数(visibleItemCount)=所有的item总数的时候, * is_divPage变为TRUE,这个时候才会加载数据。 */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { is_divPage = (firstVisibleItem + visibleItemCount == totalItemCount); } }
后台线程请求数据
/** * MyTask继承线程池AsyncTask用来网络数据请求、json解析、数据更新等操作。 */ class MyTask extends AsyncTask<String, Void, String> { /** * 数据请求前显示dialog。 */ @Override protected void onPreExecute() { super.onPreExecute(); dialog.show(); } /** * 在doInBackground方法中,做一些诸如网络请求等耗时操作。 */ @Override protected String doInBackground(String... params) { //return RequestData(); getHistoryData(); return "1"; } /** * 在该方法中,主要进行一些数据的处理,更新。 */ @Override protected void onPostExecute(String result) { super.onPostExecute(result); if (result != null) { // 如果获取的result数据不为空,那么对其进行JSON解析。并显示在手机屏幕上。 mdataList.addAll(mperDataList); mdataAdapter.bindData(mdataList); /** * 当pageNo等于1的时候才会setAdapter,以后不会再设置,直接notifyDataSetChanged,进行数据更新 * ,这样可避免每次加载更多数据的时候,都会重新回到第一页。 */ // if (mPageNo == 1) { // mListView.setAdapter(mdataAdapter); // } mdataAdapter.notifyDataSetChanged(); mPageNo++; } else if (result == null) { Toast.makeText(getActivity(), "请求数据失败...", Toast.LENGTH_LONG) .show(); } dialog.dismiss(); } }