ListView分页实现(回调)
ListView的分页很实用,实现也有很多种,我琢磨了一下要么监听ListView是否滚动到底部,如果滚动到底部,则加载下一页的数据,要么弄两个按钮,上一页和下一页,感觉这一个是引用了WEB页面的习惯。由于手机屏幕有限,所以我不喜欢第二中,而且实现起来也比较麻烦,未减少流量和加载速度,还要检测数据是否已经加载过了。
我介绍一下我的实现:基于回调来实现分页加载;
回调函数只负责显示下一页的按钮,按钮显示几秒后自动消失,
用户点击按钮,则加载下一页的数据。
下面是实现的Activity:
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Gravity;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager.LayoutParams;import android.widget.Button;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.PopupWindow;public class BookListActivity extends Activity {private ListView listView;private LinearLayout baseLayout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.ui_books);baseLayout = (LinearLayout) findViewById(R.id.root);listView = (ListView) findViewById(R.id.listView);adapter = new BookListAdapter(BookListActivity.this,new NextPageCallBack() {public void nextPage() {handler.sendEmptyMessage(SHOW);// 显示下一页的按钮handler.sendEmptyMessageDelayed(DISMISS, 3000);// 按钮显示3秒钟后,自动消失}});listView.setAdapter(adapter);// 设置adapteradapter.notifyDataSetChanged();// 数据更改的通知// 实际开发无此方法initData();// 加载下一页的数据,此时为加载第一页的数据nextPage();}private BookListAdapter adapter;// 当前的页数private int pageNow = 0;// 获取下一页的数据并显示在List里private void nextPage() {if (pageNow < source.size()) {// 模拟获取数据:可从网络或本地获取ArrayList<HashMap<String, Object>> newData = source.get(pageNow++);// 向适配器里追加内容adapter.appendItem(newData);adapter.notifyDataSetChanged();// 数据更改的通知}}// 下一页的按钮private PopupWindow nextBtnPopup;// 下一页按钮显示private void showNextButton() {if (nextBtnPopup == null) {View root = this.getLayoutInflater().inflate(R.layout.popup_next,null);nextBtnPopup = new PopupWindow(root, LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);nextBtnPopup.setAnimationStyle(R.style.next_in_out);// 淡入淡出的效果,可以取消nextBtnPopup.update();((Button) root.findViewById(R.id.btnNext))// 用户单击了下一页的按钮.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {nextPage();// 获取下一页的数据handler.sendEmptyMessage(DISMISS);// 下一页的按消失}});}// 置底显示nextBtnPopup.showAtLocation(baseLayout, Gravity.BOTTOM, 0, 0);}// 下一页按钮消失private void dismissNextButton() {if (nextBtnPopup != null) {nextBtnPopup.dismiss();}}private final int SHOW = 1;private final int DISMISS = 0;private Handler handler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case SHOW:showNextButton();break;case DISMISS:dismissNextButton();break;}}};// 按下标值来存放每一页的数据private List<ArrayList<HashMap<String, Object>>> source;// 初始化数据源,实际开发无此方法private void initData() {source = new ArrayList<ArrayList<HashMap<String, Object>>>();for (int p = 0; p < 4; p++) {// 有4页的数据ArrayList<HashMap<String, Object>> page = new ArrayList<HashMap<String, Object>>();for (int i = 0; i < 15; i++) {// 每页有15条数据HashMap<String, Object> item = new HashMap<String, Object>();item.put("name", "page:" + p);item.put("author", "book:" + i);page.add(item);}source.add(page);}}}这里是回调函数的接口:
public interface NextPageCallBack {public void nextPage();}这里是适配器类:
import java.util.ArrayList;import java.util.HashMap;import android.content.Context;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class BookListAdapter extends BaseAdapter {private ArrayList<HashMap<String, Object>> listItems;private Context mContext;private LayoutInflater inflater;private NextPageCallBack nextPageCallBack;public BookListAdapter(Context context, NextPageCallBack nextPageCallBack) {this.mContext = context;this.nextPageCallBack = nextPageCallBack;inflater = LayoutInflater.from(this.mContext);listItems = new ArrayList<HashMap<String, Object>>();}public void appendItem(ArrayList<HashMap<String, Object>> listItems) {this.listItems.addAll(listItems);Log.i("TAG", this.listItems.size() + "");}@Overridepublic int getCount() {return listItems.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}private class BookItem {public ImageView ivPicture;public TextView tvBookName;public TextView tvBookAuthor;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {BookItem item = null;if (position == getCount() - 1) {nextPageCallBack.nextPage();}if (convertView == null) {item = new BookItem();convertView = inflater.inflate(R.layout.item_book, null);item.ivPicture = (ImageView) convertView.findViewById(R.id.ivBookPicture);item.tvBookName = (TextView) convertView.findViewById(R.id.tvBookName);item.tvBookAuthor = (TextView) convertView.findViewById(R.id.tvBookAuthor);convertView.setTag(item);} else {item = (BookItem) convertView.getTag();}item.ivPicture.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_launcher));item.tvBookName.setText(listItems.get(position).get("name").toString());item.tvBookAuthor.setText(listItems.get(position).get("author").toString());return convertView;}}模拟的元数据大家可以根据自己的需要进行修改,为方便大家查看这个实现是否是大家需要的,下面的截图供大家参考:
第一页数据:

当列表置底时,显示下一页按钮:

点击下一页按钮,加载下一页数据(上一页的数据仍在),注意page 的值:

写码笔记-欢迎交流