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