[mobilesafe] 02_ListView分页查询

From Android 4.0

ListView分页查询
步骤:
1、定义好布局文件
2、在Activity中初始化好各个组件
3、为ListView设置数据适配器
4、为按钮注册点击事件
5、检查是否是首页或尾页,来设置按钮是否可用
6、逻辑代码
核心代码:
package cn.zengfansheng.listviewprenext;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

public class TestListView extends Activity {

    private ListView lv;// listview
    private Button bt_start;//首页
    private Button bt_pre;//上一页
    private Button bt_next;//下一页
    private Button bt_end;//尾页

    private TextView tv_list_pageindex;// 显示:当前页码/总页码
    private static final int PAGESIZE = 20;// 每一页显示的大小为5
    private int pageIndex = 0;// 用于显示页号的索引,默认为0
    private MyAdapter ma;// 数据适配器

    // listview中的数据
    private String[] data = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
            "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21",
            "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32",
            "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43",
            "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54",
            "55", "56", "57", "58", "59", "60", "61", "62", "64", "64", "65",
            "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76",
            "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87",
            "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98",
            "99", "100" };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_testlistview);
        // 1、 初始化View对象
        initView();
        // 2、设置适配器
        ma = new MyAdapter();
        lv.setAdapter(ma);
        
        // 3、按钮点击事件
        MyOnClickListener myListener = new MyOnClickListener();
        bt_start.setOnClickListener(myListener);
        bt_pre.setOnClickListener(myListener);
        bt_next.setOnClickListener(myListener);
        bt_end.setOnClickListener(myListener);
        
        // 4、检查Button是否是可用的
        checkButton();
    }
    /**
     * 6、返回总的页码
     * 
     * @return 返回总的页码数量
     */
    public int getPageCount(){
        int totalPage = 0;
        if (data.length%PAGESIZE==0) {
            totalPage = data.length / PAGESIZE;
        }else {
            totalPage = data.length/PAGESIZE+1;
        }
        return totalPage;
    }
    /**
     * 5-4、去末尾页码
     */
    private void goEndPage() {
        // 1、获取总页码
        int totalPage = getPageCount();
        pageIndex = totalPage - 1;// 从0开始,所以要减去一个1
        ma.notifyDataSetChanged();
        checkButton();
    }
    /**
     * 5-3、去下一页页码
     */
    private void goNextPage() {// 表示向后翻页,索引值要加1.
        pageIndex++;
        ma.notifyDataSetChanged();
        checkButton();
    }
    /**
     * 5-2、去上一页页码
     */
    private void goPrePage() {// 表示向前翻页,索引值要减1.
        pageIndex--;
        ma.notifyDataSetChanged();
        checkButton();
    }
    /**
     * 5-1、去开始页码
     */
    private void goStartPage() {
        pageIndex = 0;
        // 刷新ListView里面的数值。
        ma.notifyDataSetChanged();
        // 检查Button是否可用。
        checkButton();
    }
    
    /**
     * 4、检测当前页码,设置按钮的状态
     */
    public void checkButton() {
        // 4-1索引值小于等于0,表示不能向前翻页了,以经到了第一页了。
        if (pageIndex <= 0) {// 如果页码小于等于0,表示是第一页, 将向前翻页的按钮和跳转到首页设为不可用。
            bt_start.setEnabled(false);
            bt_pre.setEnabled(false);
            bt_end.setEnabled(true);
            bt_next.setEnabled(true);
        } else if (data.length - pageIndex * PAGESIZE < PAGESIZE) {
         // 最后一页:值的长度减去前几页的长度,剩下的就是这一页的长度,如果这一页的长度比View_Count小,表示这是最后的一页了,后面在没有了。
            bt_start.setEnabled(true);
            bt_end.setEnabled(false);
            bt_next.setEnabled(false);
            bt_pre.setEnabled(true);
        } else {// 否则将2个按钮都设为可用的。
            bt_start.setEnabled(true);
            bt_end.setEnabled(true);
            bt_pre.setEnabled(true);
            bt_next.setEnabled(true);
        }
    }
    /**
     * 3、按钮的点击事件
     * 
     * @author hacket
     */
    private class MyOnClickListener implements Button.OnClickListener {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.bt_start:// 首页
                goStartPage();
                break;
            case R.id.bt_pre:// 上一页
                goPrePage();
                break;
            case R.id.bt_next:// 下一页
                goNextPage();
                break;
            case R.id.bt_end:// 尾页
                goEndPage();
                break;
            }
        }
    }
    /**
     * 2、ListView的Adapter,这个是关键的导致可以分页的根本原因。
     * 
     * @author hacket
     */
    private class MyAdapter extends BaseAdapter {
        // 设置每一页的长度,默认的是PAGESIZE的值。
        @Override
        public int getCount() {
            // 表示到目前为止的前几页的总共的个数。
            int prePageCount = PAGESIZE * pageIndex;
            // 1、如果数据总长度-前面页码的总个数,如果小于PAGESIZE,说明到了最后一页,返回当前页码剩余的个数
            if (data.length-prePageCount < PAGESIZE) {
                return data.length-prePageCount;
            } else {// 反之,如果比默认的值还要大,说明一页显示不完,还要用换一页显示,这一页用默认的值显示满就可以了。
                return PAGESIZE;
            }
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.list_item_tv, null);
            TextView tv = (TextView) view.findViewById(R.id.tv_item_listview);
            // TextView要显示的是当前的位置+前几页已经显示的位置个数的对应的位置上的值。
            tv.setText(data[position + PAGESIZE * pageIndex]);
            // return tv;//不能用这个
            tv_list_pageindex.setText((pageIndex + 1) + "/" + getPageCount());
            return view;
        }
        @Override
        public Object getItem(int position) {
            return position;
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
    }
    /**
     * 1、初始化View对象
     */
    private void initView() {
        lv = (ListView) this.findViewById(R.id.lv);
        bt_start = (Button) this.findViewById(R.id.bt_start);
        bt_pre = (Button) this.findViewById(R.id.bt_pre);
        bt_next = (Button) this.findViewById(R.id.bt_next);
        bt_end = (Button) this.findViewById(R.id.bt_end);
        tv_list_pageindex = (TextView) this.findViewById(R.id.tv_list_pageindex);
    }
}
结果: