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

来源:互联网 发布:尚学堂 大数据 2017 编辑:程序博客网 时间:2024/06/05 22:35

原文

Android ListView分页加载功能 在实际开发中经常用到,是每个开发者必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了测试。

服务端使用MyEclipse,Android端使用Eclipse。

实现效果图:

服务端一共100条数据,共分四页,每页有25条数据。

源代码:

服务端:

需要导入图中这几个jar包。

在运行Android端代码前,需要开启服务端:

下面先给出服务端的代码:

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

0 0