標籤:
Android ListView分頁載入功能 在實際開發中經經常使用到,是每一個開發人員必須掌握的內容,本Demo給出了服務端+Android端的兩者的代碼,並成功通過了測試。
服務端使用MyEclipse,Android端使用Eclipse。
實現:
服務端一共100條資料,共分四頁,每頁有25條資料。
源碼:
服務端:
須要匯入圖中這幾個jar包。
在執行Android端代碼前,須要開啟服務端:
以下先給出服務端的代碼:
類EmpDataSource:
package com.android.divpage;import java.util.ArrayList;import java.util.List;/** * 服務端資料 * @author Administrator * */public class EmpDataSource {List<String> list; public List<String> getDataSource(){list = new ArrayList<String>();for (int i = 0; i < 100; i++) {list.add("hellonihao"+i);}return list;}}
DevidePage:
package com.android.divpage;public class DevidePage {private int pageSize;// 每頁顯示的條數private int recordCount;// 記錄的總條數private int currentPage;// 當前頁private int pageCount;// 總頁數public DevidePage(int pageSize, int recordCount, int currentPage) {this.pageSize = pageSize;this.recordCount = recordCount;this.setCurrentPage(currentPage);}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getRecordCount() {return recordCount;}public void setRecordCount(int recordCount) {this.recordCount = recordCount;}/** * 獲得總頁數 */public int getPageCount() {pageCount = recordCount / pageSize;int mod = recordCount % pageSize;if (mod != 0) {pageCount++;}return pageCount == 0 ? 1 : pageCount;}public void setPageCount(int pageCount) {this.pageCount = pageCount;}public int getCurrentPage() {return currentPage;}/** * 設定定位在當前頁 */private void setCurrentPage(int currentPage) {int activePage = currentPage <= 0 ? 1 : currentPage;activePage = activePage > getPageCount() ? getPageCount() : activePage;this.currentPage = activePage;}public int getFromIndex() {return (currentPage - 1) * pageSize;}public int getToIndex() {return Math.min(recordCount, currentPage * pageSize);}}
EmpAction:
package com.android.divpage;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONArray;public class EmpAction extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}JSONArray array = null;public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");PrintWriter writer = response.getWriter();EmpDataSource dataSource = new EmpDataSource();/** * 擷取EmpDataSource類中的資料 */List<String> list = dataSource.getDataSource();String pageNo = request.getParameter("pageNo");int currentPage = 1;//當前頁是第一頁if (pageNo != null) {currentPage = Integer.parseInt(pageNo);}/** * 分頁:每頁有25條資料,由於有100條,所以總共同擁有4頁。 */DevidePage pUtil = new DevidePage(25, list.size(),currentPage);int start = pUtil.getFromIndex();int end = pUtil.getToIndex();List<String> subList = list.subList(start, end);array = JSONArray.fromObject(subList);writer.println(array);writer.flush();writer.close();}}
Android端;
布局檔案:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" > </ListView></RelativeLayout>
MainActivity:
記住須要把路徑中的ip地址換成你自己原生ip地址。
package com.listviewdemo_divpage;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.json.JSONArray;import org.json.JSONException;import android.app.Activity;import android.app.ProgressDialog;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private String EMP_PATH = "http://172.16.17.36:8080/JsonServiceDemo/servlet/EmpAction?pageNo=";private ListView listView;private MyAdapter adapter;private boolean is_divPage;// 是否進行分頁操作private List<String> oneTotal = new ArrayList<String>();// 用來存放一頁資料private List<String> total = new ArrayList<String>();//用來存放擷取的全部資料private ProgressDialog dialog;private static int pageNo = 1;//設定pageNo的初始化值為1,即預設擷取的是第一頁的資料。@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (ListView) findViewById(R.id.listView);dialog = new ProgressDialog(MainActivity.this);dialog.setTitle("警告");dialog.setMessage("正在載入資訊...");adapter = new MyAdapter();/** * 用來擷取資料... */new MyTask().execute(EMP_PATH + pageNo);listView.setOnScrollListener(new OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {/** * 當分頁操作is_divPage為true時、滑動停止時、且pageNo<=4(這裡由於服務端有4頁資料)時,載入很多其它資料。 */if (is_divPage && scrollState == OnScrollListener.SCROLL_STATE_IDLE && pageNo <=4) {Toast.makeText(MainActivity.this, "正在擷取很多其它資料...",Toast.LENGTH_SHORT).show();new MyTask().execute(EMP_PATH+pageNo);}else if (pageNo >4) {/** * 假設pageNo>4則表示,服務端沒有很多其它的資料可供載入了。 */Toast.makeText(MainActivity.this, "沒有很多其它資料啦...", Toast.LENGTH_SHORT).show();}}/** * 當:第一個可見的item(firstVisibleItem)+可見的item的個數(visibleItemCount)=全部的item總數的時候, * is_divPage變為TRUE,這個時候才會載入資料。 */@Overridepublic 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。 */@Overrideprotected void onPreExecute() {super.onPreExecute();dialog.show();}/** * 在doInBackground方法中,做一些諸如網路請求等耗時操作。 */@Overrideprotected String doInBackground(String... params) {return RequestData();}/** * 在該方法中,主要進行一些資料的處理,更新。 */@Overrideprotected void onPostExecute(String result) {super.onPostExecute(result);if (result != null) {// 假設擷取的result資料不為空白,那麼對其進行JSON解析。並顯示在手機螢幕上。List<String> list = JSONAnalysis(result);total.addAll(list);adapter.bindData(total);/** * 當pageNo等於1的時候才會setAdapter,以後不會再設定,直接notifyDataSetChanged,進行資料更新 * ,這樣可避免每次載入很多其它資料的時候,都會又一次回到第一頁。 */if (pageNo == 1) {listView.setAdapter(adapter);}adapter.notifyDataSetChanged();pageNo++;} else if (result == null) {Toast.makeText(MainActivity.this, "請求資料失敗...", Toast.LENGTH_LONG).show();}//dialog.dismiss();}}/** * ListView的適配器 */class MyAdapter extends BaseAdapter {List<String> list;/** * bindData用來傳遞資料給適配器。 * @param list */public void bindData(List<String> list) {this.list = list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView textView = null;if (convertView == null) {textView = new TextView(MainActivity.this);} else {textView = (TextView) convertView;}textView.setTextSize(20);textView.setText(list.get(position));return textView;}}/** * 網路資料請求 * @return */public String RequestData() {HttpGet get = new HttpGet(EMP_PATH+pageNo);HttpClient client = new DefaultHttpClient();StringBuilder builder = null;try {HttpResponse response = client.execute(get);if (response.getStatusLine().getStatusCode() == 200) {InputStream inputStream = response.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));builder = new StringBuilder();String s = null;for (s = reader.readLine(); s != null; s = reader.readLine()) {builder.append(s);}}} catch (Exception e) {e.printStackTrace();}return builder.toString();}/** * JSON解析 * @param result * @return */public List<String> JSONAnalysis(String result) {oneTotal.clear();//解析之前 先清理一下,以保證僅僅儲存該頁的資料,避免反覆。JSONArray array = null;try {array = new JSONArray(result);} catch (JSONException e) {e.printStackTrace();}try {String str0 = array.getString(0);String str1 = array.getString(1);String str2 = array.getString(2);String str3 = array.getString(3);String str4 = array.getString(4);String str5 = array.getString(5);String str6 = array.getString(6);String str7 = array.getString(7);String str8 = array.getString(8);String str9 = array.getString(9);String str10 = array.getString(10);String str11 = array.getString(11);String str12 = array.getString(12);String str13 = array.getString(13);String str14 = array.getString(14);String str15 = array.getString(15);String str16 = array.getString(16);String str17 = array.getString(17);String str18 = array.getString(18);String str19 = array.getString(19);String str20 = array.getString(20);String str21 = array.getString(21);String str22 = array.getString(22);String str23 = array.getString(23);String str24 = array.getString(24);oneTotal.add(str0);oneTotal.add(str1);oneTotal.add(str2);oneTotal.add(str3);oneTotal.add(str4);oneTotal.add(str5);oneTotal.add(str6);oneTotal.add(str7);oneTotal.add(str8);oneTotal.add(str9);oneTotal.add(str10);oneTotal.add(str11);oneTotal.add(str12);oneTotal.add(str13);oneTotal.add(str14);oneTotal.add(str15);oneTotal.add(str16);oneTotal.add(str17);oneTotal.add(str18);oneTotal.add(str19);oneTotal.add(str20);oneTotal.add(str21);oneTotal.add(str22);oneTotal.add(str23);oneTotal.add(str24);} catch (JSONException e) {e.printStackTrace();}return oneTotal;//僅僅返回該頁的資料}}
記住要在Manifest.xml檔案裡加入網路許可權。
源碼下載:
點擊下載原始碼
Android ListView分頁載入(服務端+android端)Demo