一 般大家估计都很少会遇到需要LisView翻页的问题,但是我们现在做的项目就遇到了这样的需求,不是拖到ListView而是点击按钮进行翻页!
于是就自己封装了一个Adapter
先上代码:
import java.util.HashMap; import java.util.List; import android.content.Context; import android.database.Cursor; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; /** * 可翻页ListView适配器 * 本适配器目前支持两种数据来源,一个是数据库Cursor 一个是普通字符串List * 使用者可以自行扩充本适配器,应满足需求! * * @author 祝建宾 * Create date 2011/8/9 * Version 1.0 * */ public class PageableAdapter extends BaseAdapter { public static final int DATA_FROM_CURSOR = 1; public static final int DATA_FROM_LIST = 2; private static final int DEF_PAGESIZE = 5; private int totalCount; //内容总条数 private int pageSize; //一页显示的行数 private int pageIndex; //当前显示的页码 private int pageCount; //总页数 private int srcType; //数据来源 private boolean showLineNum; //显示行标 // private boolean hasNext, hasPrev; //标志是否有上一页/下一页 private Context context; private LayoutInflater mInflater; //布局文件解析器 private int layout; //布局文件资源ID private Cursor cursor; //数据库查询游标 private List<? extends HashMap<String, ?>> list; //List数据来源 private String[] from; //数据来源标志 private int[] to; //数据去向 (显示控件ID) /** * 构造器 * 适用于数据库数据显示 * @param context 上下文 * @param layout ListItem 布局文件 * @param c 数据库查询游标 * @param from 数据库列标 * @param to 对应于列标 显示的容器 */ public PageableAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to) { super(); this.context = context; this.layout = layout; this.cursor = cursor; this.from = from; this.to = to; //获取系统布局文件解析器 this.mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //数据初始化 srcType = DATA_FROM_CURSOR; totalCount = cursor.getCount(); pageSize = DEF_PAGESIZE; showLineNum = true; pageIndex = 1; countPage(); } /** * 适配器 * 数据来源 List 继承自HashMap 采取键值对形式传入参数 * @param context * @param list * @param from * @param to */ public PageableAdapter(Context context, List<? extends HashMap<String, ?>> list, String[] from, int[] to) { super(); this.context = context; this.list = list; this.from = from; this.to = to; //数据初始化 srcType = DATA_FROM_LIST; totalCount = list.size(); pageSize = DEF_PAGESIZE; showLineNum = true; pageIndex = 1; countPage(); } /** * 内部方法,计算总页数 */ private void countPage() { pageCount = totalCount/pageSize; // if(totalCount%pageSize > 0) //最后一页不足pagesize个 pageCount++; } /** * ListView通过此方法获知要显示多少行内容 * 我们即在此方法下手,每次设置一页需要显示的行数 * 返回值:ListView 要显示的行数 */ public int getCount() { //如果总行数小于一页显示的行数,返回总行数 if(totalCount < pageSize) { return totalCount; }//即最后一页不足5行(页面行数) else if(totalCount < pageIndex*pageSize) { return (totalCount-(pageIndex-1)*pageSize); }else //其他情况返回页面尺寸 { return pageSize; } } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } /** * 获取每一项item */ public View getView(int position, View convertView, ViewGroup parent) { convertView = mInflater.inflate(layout, null); int index = position + pageSize*(pageIndex-1); //position对应到数据集中的正确位置 //将各个要显示的值部署到显示控件 for(int i=0; i<Math.min(to.length, from.length); i++) { //控件ID TextView tv = (TextView)convertView.findViewById(to[i]); //要显示的内容 String text = null; switch (srcType) { case DATA_FROM_CURSOR: //cursor获取数据 { cursor.moveToPosition(index); text = cursor.getString(cursor.getColumnIndex(from[i])); break; } case DATA_FROM_LIST: //list获取数据 { HashMap<String, ?> map; map = list.get(index); text = (String)map.get(from[i]).toString(); break; } } tv.setText(text); //设置textview显示文本 } return convertView; } /** * 返回列表是否有下一页 * @return */ public boolean hasNextPg() { return pageIndex*pageSize < totalCount; } /** * 返回是否有上一页 * @return */ public boolean hasPrevPg() { return pageIndex > 1; } /** * 下翻页,如果有下一页则返回成功 * @return */ public boolean pgDown() { if(!hasNextPg()) return false; pageIndex++; this.notifyDataSetChanged(); return true; } /** * 上翻页 * @return */ public boolean pgUp() { if(!hasPrevPg()) return false; pageIndex--; this.notifyDataSetChanged(); return true; } /** * 跳转到某个页码 * @param pageIndex */ public void gotoPageIndex(int pageIndex) { this.pageIndex = pageIndex; this.notifyDataSetChanged(); } /** * 跳到第一页 */ public void gotoFirstPg() { if(pageIndex != 1) { pageIndex = 1; this.notifyDataSetChanged(); } } /** * 跳到最后一页 */ public void gotoLastPg() { this.pageIndex = 1; this.notifyDataSetChanged(); } /** * 获取一页行数 * @return */ public int getPageSize() { return pageSize; } /** * 设置一页行数 * @param pageSize */ public void setPageSize(int pageSize) { this.pageSize = pageSize; } /** * 获取总行数 * @return */ public int getTotalCount() { return totalCount; } /** * 获取当前显示的页码 * @return */ public int getPageIndex() { return pageIndex; } /** * 显示/影藏行号 * !未实现 * @param show */ public void showLineNum(boolean show) { this.showLineNum = show; this.notifyDataSetChanged(); } }
我是个菜鸟啦,还望大家多多提出建议哦