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; } }