Android ListView分页加载数据Demo

本文介绍了一个简单的Android分页加载数据实例,通过滑动到底部自动加载下一页数据。示例中详细展示了如何使用ListView组件实现分页加载,并通过自定义监听器处理滚动事件以实现自动刷新和数据加载。

     一个简单的Android分页加载数据的实例,实例中加载方式是滑动到底部自动加载下页数据,现在加载方式可以是点击拖拽一个自己定义的控件。

    下面是一个主要的Activity代码:

public class MainActivity extends Activity {
	private ListView listview;
	private View footer;
	private List<String> data;
	private ArrayAdapter<String> adapter;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		listview = (ListView) findViewById(R.id.listview);
		// 给adapter添加数据
		data = new DataService().getData();
		adapter = new ArrayAdapter<String>(this, R.layout.item, R.id.tv_name, data);
		// 必须在setAdapter之前把head和Footer设置好
		footer = getLayoutInflater().inflate(R.layout.footer, null);
		listview.addFooterView(footer);

		// listview设置adpater
		listview.setAdapter(adapter);
		listview.removeFooterView(footer);
		// 以上就可以显示ListView上的数据,可是不能分页显示,没有给LIstView添加滚动事件,
		// 下面我们来给ListVIew添加滚动事件,从而达到自动刷新ListView分页加载数据的功能
		listview.setOnScrollListener(new MyOnScrollListener());
	}

	public final class MyOnScrollListener implements OnScrollListener {
		protected static final int GET_DATA_SUCCESS = 0;
		private int pageCount = 20;
		private int pageSize = 5;
		// 是否加载完成
		Boolean finish = true;
		private Handler mHandler = new Handler() {
			public void handleMessage(Message msg) {
				msg.what = GET_DATA_SUCCESS;
				List<String> result = (List<String>) msg.obj;
				data.addAll(result);
				finish = true;
				if (listview.getFooterViewsCount() > 0) {
					listview.removeFooterView(footer);
				}
				// 通知适配器更新数据
				adapter.notifyDataSetChanged();
			};
		};

		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {

		}

		@Override
		public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
			// 计算当前加载上来的全部item数目
			int totalItem = firstVisibleItem + visibleItemCount;
			// 计算当前页
			int currenPage = totalItemCount / pageSize;
			// 计算下一页的数值
			int nextPage = currenPage + 1;
			// 当 当前加载过的item总数目等于总显示过的Item数目的时候可以去加载
			if (totalItem == totalItemCount) {
				if (nextPage < pageCount && finish) {
					finish = false;
					listview.addFooterView(footer);
					// 开始加载数据
					new Thread() {
						public void run() {
							SystemClock.sleep(3000);
							List<String> result = new DataService().getData();
							Message msg = new Message();
							msg.what = GET_DATA_SUCCESS;
							msg.obj = result;
							mHandler.sendMessage(msg);
						}

					}.start();
				}
			}
		}
	}
}

如下是提供数据的service,

public class DataService {
	/*
	 * 每次生成一个20个元素的List列表返回
	 */
	public List<String> getData() {
		List<String> data = new ArrayList<String>();
		for (int i = 0; i < 20; i++) {
			data.add("当前item的id是:" + i);
		}
		return data;
	}
}

转载于:https://my.oschina.net/keeponmoving/blog/63207

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值