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="";
-
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=""
-
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 @
-
* 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 @
-
* 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);
-
}
- }