Android ListView分页加载数据Demo

原创
2012/06/21 00:19
阅读数 6.8K

     一个简单的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;
	}
}

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
9 收藏
0
分享
返回顶部
顶部