Android ListView分页加载数据Demo

openkk 12年前

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