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,即默认获取的是第一页的数据。 @Override
protected 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() { @Override
public 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,这个时候才会载入数据。
*/
@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();
} /**
* 在该方法中,主要进行一些数据的处理,更新。
*/
@Override
protected 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;
} @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public 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的更多相关文章

  1. android中listview分页载入数据

    前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方 ...

  2. Android --ListView分页

    参考博客:Android ListView分页加载(服务端+android端)Demo 监听OnScrollListener事件 class OnListScrollListener implemen ...

  3. listview分页载入问题

    方案一: 底部有查看很多其它能够使用HeaderViewListAdapter 假设须要加入数据, 就向Adapter绑定的数据里面加入. 然后调用Adapter.notifyDataSetChang ...

  4. Android ListView分页加载时图片显示问题

    场景:Android ListView需要分页加载,每个item中会有图片,图片又是从网络下载的. 问题:在滑动加载下一页时,上一页的图片明明已经下载完成了,但是无法显示出来. Bug重现: 1,加载 ...

  5. Android ListView分页,动态添加数据

    1.ListView分页的实现,重点在于实现OnScrollListener接口,判断滑动到最后一项时,是否还有数据可以加载, 我们可以利用listView.addFootView(View v)方法 ...

  6. android ListView 分页加载数据

    1.mainActivity <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

  7. android listView 滑动载入数据 该数据是服务端获取的

    package com.sunway.works.applycash; import java.util.ArrayList; import java.util.Calendar; import ja ...

  8. android ListView优化

    android ListView通过优化重用历史缓存实现.listview相应的数据适配器一般使用自己定义BaseAdapter子类,重用历史缓冲区来提高性能. 例如,下面的示例代码演示: 1.lis ...

  9. 停车场管理软件附带源代码 J2EE服务端+android客户端

    该源码是停车场管理软件附带源代码 J2EE服务端+android客户端,也是一套停车场管理车辆进出的管理软,喜欢的朋友可以看看吧. 应用的后台管理主要功能介绍:1  机构管理 ,机构有从属管理< ...

随机推荐

  1. C++操作符operator的另一种用法

    http://blog.csdn.net/memewry/article/details/7833314 参考地址 今天在程序员面试宝典上看到这样一道题目:  A C++ developer want ...

  2. Net处理html页面元素工具类(HtmlAgilityPack.dll)的使用

    现在,在不少应用场合中都希望做到数据抓取,特别是基于网页部分的抓取.其实网页抓取的过程实际上是通过编程的方法,去抓取不同网站网页后,再进行 分析筛选的过程.比如,有的比较购物网站,会同时去抓取不同购物 ...

  3. Android数据库hibernate框架

    说明 /** * YDL_Hibernate总结 <br/> * (一)支持功能: 1.自己主动建表,支持属性来自继承类:可依据注解自己主动完毕建表,而且对于继承类中的注解字段也支持自己主 ...

  4. Mac下配置Cocos2d-x3.1环境

    一.前期准备 1.ADT:百度下就OK 2.NDK:百度下就OK 3.ANT: http://124.254.47.39/download/55152992/78533365/4/zip/57/132 ...

  5. Debian7.6安装过程中遇到的问题

    一 sudo命令不能用 1 使用su切换到root用户,命令: su 2 使用名:vim /etc/sudoers加入sudoer用户,命令: vim /etc/sudoers 找到root=(ALL ...

  6. ubuntu下使用自带的openJDK查看java源码

    如题 Ubuntu自带的OpenJDK仅仅有jre环境,不提供源代码,所以我们还是须要去下载. JDK6:http://download.java.net/openjdk/jdk6/ JDK7:htt ...

  7. Socket编程实践(12) --UDP编程基础

    UDP特点 无连接,面向数据报(基于消息,不会粘包)的传输数据服务; 不可靠(可能会丢包, 乱序, 反复), 但因此普通情况下UDP更加高效; UDP客户/服务器模型 UDP-API使用 #inclu ...

  8. hdu 3790 (最短路径问题dijkstra)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...

  9. EF 分离实体

    具体步骤: 新建测试项目:如图 其中Respository和Model层均为类库项目, 1.在Respository层添加ADO.NET实体数据模型, 2.复制Model.tt文件到Model层,这是 ...

  10. OCP读书笔记(18) - 空间管理

    OLTP 表压缩 压缩始终是非常占用CPU的过程,并且需要花费一定时间,通常,如果压缩数据,则数据必须解压缩后才能使用.虽然此要求在数据仓库环境中是可以接受的但在OLTP环境中可能无法接受 现在,在O ...