客户端:
服务器端:
MainActivity.java
- package cn.com.xiebiao.listview;
- 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.BaseAdapter;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
-
- import java.util.ArrayList;
- import java.util.List;
-
- public class MainActivity extends Activity {
- private String serverAddr="http://192.168.1.102:8080/DividePage/dividePageServlet?pageNo=";
- private ListView listView;
- //是否分页
- private boolean is_divpage;
- //loading dialog
- private ProgressDialog dialog;
- //用于保存接收的数据
- List<String> data=new ArrayList<String>();
- //页数
- private static int pageNo=1;
-
- MyAdapter myAdapter=new MyAdapter();
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- listView = (ListView) this.findViewById(R.id.listView);
- //设置ProgressDialog属性
- dialog=new ProgressDialog(this);
- dialog.setTitle("提示");
- dialog.setMessage("loading...");
- //初始的时候加载第一页
- new MyTask().execute(serverAddr+pageNo);
-
- listView.setOnScrollListener(new AbsListView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(AbsListView absListView, int i) {
- System.out.println("----onScrollStateChanged>>"+i);
- //onScrollStateChanged再手指离开屏幕的瞬间调用,所以晚于onScroll的最后一次调用
- if(is_divpage&& i==0){
- //手指划到最底部并松开,即表示请求下次数据
- is_divpage=true;
- Toast.makeText(MainActivity.this,"下一页",Toast.LENGTH_SHORT).show();
- new MyTask().execute(serverAddr+pageNo);
- }
- }
-
- @Override
- public void onScroll(AbsListView absListView, int i, int i2, int i3) {
- if((i+i2)==i3){
- //滑到最底部
- is_divpage=true;
- }else {
- is_divpage=false;
- }
- }
- });
- }
-
- //异步任务,再网络上读取数据
- class MyTask extends AsyncTask<String,Void,List<String>>{
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- dialog.show();
- }
-
- @Override
- protected List<String> doInBackground(String... strings) {
- String jsonString=HttpUtils.sendPostMethod(strings[0],"utf-8");
- List<String> list=JsonTools.parseJsonList(jsonString);
- return list;
- }
-
- @Override
- protected void onPostExecute(List<String> strings) {
- super.onPostExecute(strings);
- data.addAll(strings);
-
- //更新data
- myAdapter.bindDate(data);
-
- if(pageNo==1){
- listView.setAdapter(myAdapter);
- }
- myAdapter.notifyDataSetChanged();
- pageNo++;
- //关闭progressDialog
- dialog.dismiss();
- }
- }
-
- class MyAdapter extends BaseAdapter {
- private List<String> list;
- private TextView textView;
-
- MyAdapter() {
- }
-
- public void bindDate(List<String> list){
- this.list = list;
- }
-
- @Override
- public int getCount() {
- System.out.println("--->>getCount中size=" + list.size());
- return list.size();
- }
-
- @Override
- public Object getItem(int i) {
- System.out.println("--->>getItem中i=" + i);
- return i;
- }
-
- @Override
- public long getItemId(int i) {
- System.out.println("--->>getItemID中i=" + i);
- return 5;
- }
-
- @Override
- public View getView(int i, View view, ViewGroup viewGroup) {
- System.out.println("--->>getView中i=" + i);
- if (view == null) {
- textView=new TextView(MainActivity.this);
- } else {
- textView=(TextView)view;
- }
- textView.setText(list.get(i));
- textView.setTextSize(30);
- return textView;
- }
- }
- }
AndroidMainfest.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="cn.com.xiebiao.listview" >
- <uses-permission android:name="android.permission.INTERNET"></uses-permission>
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
-
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
-
- </manifest>
HttpUtil.java
- package cn.com.xiebiao.listview;
-
- import org.apache.http.HttpResponse;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.apache.http.util.EntityUtils;
-
- import java.io.IOException;
-
- /**
- * Created by vibexie on 3/23/15.
- */
- public class HttpUtils {
-
- public static String sendPostMethod(String path,String encoding){
- String result=null;
- HttpClient httpClient=new DefaultHttpClient();
- HttpPost httpPost=new HttpPost(path);
- try {
- HttpResponse httpResponse=httpClient.execute(httpPost);
- if(httpResponse.getStatusLine().getStatusCode()==200){
- result= EntityUtils.toString(httpResponse.getEntity(),encoding);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }finally {
- httpClient.getConnectionManager().shutdown();
- }
-
- return result;
- }
- }
JsonTool.java
- package cn.com.xiebiao.listview;
-
- import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;
-
- import java.util.ArrayList;
- import java.util.List;
-
- /**
- * Created by vibexie on 3/23/15.
- */
- public class JsonTools {
- public static List<String> parseJsonList(String jsonString){
- List<String> list=new ArrayList<String>();
- try {
- JSONObject jsonObject=new JSONObject(jsonString);
- JSONArray jsonArray=jsonObject.getJSONArray("data");
- for(int i=0;i<jsonArray.length();i++){
- list.add(jsonArray.getString(i));
- }
- } catch (JSONException e) {
- e.printStackTrace();
- }
- return list;
- }
- }
服务器端:
DividePageServlet.java
- package cn.com.xiebiao.dividePage;
-
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- import net.sf.json.JSONSerializer;
-
-
- /**
- *
- * Title : DividePageServlet.java
- * Company: ZhenBot
- * Author : Vibe Xie @www.xiebiao.com.cn
- * Time : Mar 23, 2015 10:30:03 AM
- * Copyright: Copyright (c) 2015
- * Description: 服务器端将数据进行分页,客户端发送页码请求,服务器返回对应页的json数据
- */
- @WebServlet("/dividePageServlet")
- public class DividePageServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- //private static int currentPage;//当前页
- /**
- * @see HttpServlet#HttpServlet()
- */
- public DividePageServlet() {
- super();
- // TODO Auto-generated constructor stub
- }
-
- /**
- * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
- */
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // TODO Auto-generated method stub
- doPost(request, response);
- }
-
- /**
- * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
- */
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // TODO Auto-generated method stub
- request.setCharacterEncoding("utf-8");
- response.setCharacterEncoding("utf-8");
- response.setContentType("text/html;charset=utf-8");
- PrintWriter printWriter=response.getWriter();
-
- //获取资源
- DataSource dataSource=new DataSource();
- List<String> date=dataSource.getDataSource();
-
- //获取客户端的请求页码
- String pageNo=request.getParameter("pageNo");
-
- int currentPage=1;//当前页
- //请求页码非空的时候设定当前页为请求页
- if(pageNo!=null){
- currentPage=Integer.parseInt(pageNo);
- }
-
- DividePageUtil dividePageUtil=new DividePageUtil(25, date.size(), currentPage);
- int fromIndex=dividePageUtil.getFromIndex();
- int toIndex=dividePageUtil.getToIndex();
-
- //当前页的数据
- List<String> subData=date.subList(fromIndex, toIndex);
- //将当前页的数据包装成json数据
- Map<String, Object> map=new HashMap<String, Object>();
- map.put("data", subData);
- String jsonString=JSONSerializer.toJSON(map).toString();
-
- //返回给客户端
- printWriter.print(jsonString);
- printWriter.flush();
- printWriter.close();
- }
-
- }
DataSource.java
- package cn.com.xiebiao.dividePage;
-
- import java.util.ArrayList;
- import java.util.List;
-
- public class DataSource {
- private List<String> list;
-
- public DataSource() {
- // TODO Auto-generated constructor stub
- }
-
- public List<String> getDataSource(){
- list=new ArrayList<String>();
- for(int i=1;i<=500;i++){
- list.add("data"+i);
- }
- return list;
- }
- }
DividePageUtil.java
- package cn.com.xiebiao.dividePage;
-
- /**
- *
- * Title : DividePageUtil.java
- * Company: ZhenBot
- * Author : Vibe Xie @www.xiebiao.com.cn
- * Time : Mar 23, 2015 10:52:38 AM
- * Copyright: Copyright (c) 2015
- * Description:分页工具类
- */
- public class DividePageUtil {
- private int pageSize;//每页条数
- private int dataSize;//数据的总条数
- private int currentPage;//当前页
- private int pageCount;//总页数
-
- public DividePageUtil(int pageSize,int dateSize,int currentPage) {
- // TODO Auto-generated constructor stub
- this.pageSize=pageSize;
- this.dataSize=dateSize;
- this.setCurrentPage(currentPage);
- }
-
- public int getPageSize() {
- return pageSize;
- }
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- }
- public int getDataSize() {
- return dataSize;
- }
- public void setDataSize(int dataSize) {
- this.dataSize = dataSize;
- }
- public int getCurrentPage() {
- return currentPage;
- }
-
- //设置当前页
- public void setCurrentPage(int currentPage){
- int activePage= currentPage<=0 ? 1 :currentPage;
- activePage= currentPage>getPageCount() ? getPageCount() : activePage;
- this.currentPage=activePage;
- }
-
- //获取总页数
- public int getPageCount() {
- pageCount=dataSize/pageSize;
- if((dataSize%pageSize)!=0){
- pageCount++;
- }
- return dataSize==0 ? 1 : pageCount;
- }
- public void setPageCount(int pageCount) {
- this.pageCount = pageCount;
- }
-
- //获取指定页的起始索引
- public int getFromIndex(){
- return (currentPage-1)*pageSize;
- }
- //获取指定页的结束索引
- public int getToIndex(){
- return (currentPage*pageSize);
- }
- }