Android数据分批加载-滑动到底部自动加载列表
2014年5月9日
摘自:《Android高级开发实战—ui、ndk与安全》
本博文介绍如何进行数据分批加载,在应用开发当中会经常使用到ListView,点击更多加载数据是我们经常简单,为了提供用户体验,当用户将列表滚动到底部自动加载数据,这样的形式用得比较多。
下面给大家提供的例子是,每次模拟20条数据,滑动到底部时再请求20条数据直到请求到限定页数为止
具体代码实现:
/08_Datapageload/src/com/wwj/datapageload/MainActivity.java
- package com.wwj.datapageload;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.util.Log;
- import android.view.View;
- import android.widget.AbsListView;
- import android.widget.AbsListView.OnScrollListener;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- public class MainActivity extends Activity {
- private ListView listView;
- private List<String> data = new ArrayList<String>();
- ArrayAdapter<String> adapter;
- View footer;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- footer = getLayoutInflater().inflate(R.layout.footer, null);
- listView = (ListView) findViewById(R.id.listView);
- listView.setOnScrollListener(new ScrollListener());
- // 模拟数据
- data.addAll(DataService.getData(0, 20));
- adapter = new ArrayAdapter<String>(this, R.layout.listview_item,
- R.id.textView, data);
- listView.addFooterView(footer);// 添加页脚(放在ListView最后)
- listView.setAdapter(adapter);
- listView.removeFooterView(footer);
- }
- private int number = 20; // 每次获取多少条数据
- private int maxpage = 5; // 总共有多少页
- private boolean loadfinish = true; // 指示数据是否加载完成
- private final class ScrollListener implements OnScrollListener {
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem,
- int visibleItemCount, int totalItemCount) {
- Log.i("MainActivity", "onScroll(firstVisibleItem="
- + firstVisibleItem + ",visibleItemCount="
- + visibleItemCount + ",totalItemCount=" + totalItemCount
- + ")");
- final int loadtotal = totalItemCount;
- int lastItemid = listView.getLastVisiblePosition(); // 获取当前屏幕最后Item的ID
- if ((lastItemid + 1) == totalItemCount) { // 达到数据的最后一条记录
- if (totalItemCount > 0) {
- // 当前页
- int currentpage = totalItemCount % number == 0 ? totalItemCount
- / number
- : totalItemCount / number + 1;
- int nextpage = currentpage + 1; // 下一页
- if (nextpage <= maxpage && loadfinish) {
- loadfinish = false;
- listView.addFooterView(footer);
- // 开一个线程加载数据
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- List<String> result = DataService.getData(
- loadtotal, number);
- // 发送消息
- handler.sendMessage(handler.obtainMessage(100,
- data));
- }
- }).start();
- }
- }
- }
- }
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- Log.i("MainActivity", "onScrollStateChanged(scrollState="
- + scrollState + ")");
- }
- }
- private Handler handler = new Handler() {
- public void handleMessage(android.os.Message msg) {
- data.addAll((List<String>) msg.obj);
- // 告诉ListView数据已经发生改变,要求ListView更新界面显示
- adapter.notifyDataSetChanged();
- if (listView.getFooterViewsCount() > 0) { // 如果有底部视图
- listView.removeFooterView(footer);
- }
- loadfinish = true; // 加载完成
- };
- };
- }
/08_Datapageload/src/com/wwj/datapageload/DataService.java
- package com.wwj.datapageload;
- import java.util.ArrayList;
- import java.util.List;
- public class DataService {
- public static List<String> getData(int offset, int maxResult) { // 分页limit
- // 0,20
- List<String> data = new ArrayList<String>();
- for (int i = 0; i < 20; i++) {
- data.add("ListView数据的分批加载" + i);
- }
- return data;
- }
- }
效果图如下: