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

原文

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值