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

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,布布扣,bubuko.com

时间: 2024-10-27 10:28:53

Android ListView分页加载(服务端+android端)Demo的相关文章

android Listview分批加载+自动加载(附源码下载)

直接上代码,代码有注释: public class TestForListviewActivity extends Activity implements OnScrollListener { private ListView mListview = null; private View mFooterView; private PaginationAdapter mAdapter; private Handler handler=new Handler(); private boolean i

Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)

最近在做ListView分页显示,其中包括图片 和文字(先下载解析文字内容,再异步加载图片)发现每次点击下一页后,文字内容加载完毕,马上向下滑动,由于这时后台在用线程池异步下载图片,我每页有20条,也就是20张图片,会导致listview滑动卡顿! 这是用户不想看到的,我参考了网易新闻和电子市场等应用,发现它们都是只加载屏幕内的图片,不现实的不加载,于是我也仿照做了一个.我是菜鸟,我承认 呵呵,虽然不见得完全和他们的一样,但是确实解决了翻页时那一刻的卡顿现象. 因为未发现网上有相关文章,希望对朋

android listview 异步加载图片并防止错位

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

android listview 异步加载图片并防止错位+双缓存

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

又优化了一下 Android ListView 异步加载图片

写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看了这篇文章而受到了启发. 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,

android listview 异步加载图片并防止错位 解决办法

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

ListView分页加载数据

在android软件开发中,ListView是一种经常被用到的组件.当需要用到列表显示的时候,通常都会用到.而使用的过程中也可能出现一些问题.比如,一次性加载过多的Item对于手机有限的内存来说,是一种负担.于是就有了分页加载的技术,一般的说,分页的使用方式有两种,一是在滑动到底部的时候,自动加载下一部分的内容.另一种则是在底部添加一个类似按钮的控件,点击后加载内容.这里介绍的是第一种.同样的,代码来自github,网址是:https://github.com/nicolasjafelle/Pa

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

Android ListView分页载入功能 在实际开发中经经常使用到,是每一个开发人员必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了測试. 服务端使用MyEclipse,Android端使用Eclipse. 实现效果图: 服务端一共100条数据,共分四页,每页有25条数据. 源码: 服务端: 须要导入图中这几个jar包. 在执行Android端代码前,须要开启服务端: 以下先给出服务端的代码: 类EmpDataSource: package com.andr

android listview 异步加载问题

============问题描述============ 学做android,自己想模仿QQ空间做一个小demo listview异步加载图片的时候遇到了一个问题 异步加载用到了SoftReference 和文件缓存的方法 每次加载图片的时候,也在内存或缓存中找到了图片 第一次加载出来后,listview滑动了,同样也进到了setImageBitmap这一步 可是就是图片显示不出来变成空白 下面帖几张图和代码 滑动前 滑动后 Image_url = new StringBuffer(AppCon