Android ListView分页加载(服务端+android端)Demo

来源:互联网 发布:四选一数据选择器芯片 编辑:程序博客网 时间:2024/05/21 11:01

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文件中添加网络权限。


源代码下载:

点击下载源码

6 0
原创粉丝点击