天天看点

Android listView滑动刷新代码(分页功能)

三个代码都是从网上下载来的,但是导入到eclipse里面以后,中文注释出现乱码,所以我文章里面的注释有很多可能是自己添加的,如有不准确的地方,敬请谅解和留言告知!

这个例子是listview一开始显示10个,下拉listview,就会更新添加列表,知道第50个。

       首先,布局文件是非常简单,可以直接看代码,首先,先看下自定义的一个简单的adapter:

[java] view

plaincopy

class listviewadapter extends baseadapter {  

        int count = 10;  

        public int getcount() {  

            return count;  

        }  

        public object getitem(int pos) {  

            return pos;  

        public long getitemid(int pos) {  

        public view getview(int pos, view v, viewgroup p) {  

            textview view;  

            if (v==null) {  

                view = new textview(mainactivity.this);  

            }  

            else {  

                view=(textview)v;  

            view.settext("listitem " + pos);  

            view.settextsize(20f);  

            view.setgravity(gravity.center);  

            view.setheight(60);  

            return view;  

    }  

在这里初始化的count,就是listview的item个数是十个,当滑动的时候,再动态增加。

在看一下,在oncreate方法里面通过代码把控件添加进去。

//线性布局  

        linearlayout layout = new linearlayout(this);  

       //设置布局 水平方向  

        layout.setorientation(linearlayout.horizontal);  

         //进度条  

        progressbar = new progressbar(this);  

         //进度条显示位置  

        progressbar.setpadding(0, 0, 15, 0);  

        //把进度条加入到layout中  

        layout.addview(progressbar, mlayoutparams);  

        //文本内容  

        textview textview = new textview(this);  

        textview.settext("加载中。。。");  

        textview.setgravity(gravity.center_vertical);  

        //把文本加入到layout中  

        layout.addview(textview, fflayoutparams);  

        //设置layout的重力方向,即对齐方式是  

        layout.setgravity(gravity.center);  

        ///设置listview的页脚layout  

        loadinglayout = new linearlayout(this);  

        loadinglayout.addview(layout, mlayoutparams);  

        loadinglayout.setgravity(gravity.center);  

        //得到一个listview用来显示条目  

        listview = getlistview();  

        //添加到页脚显示  

        listview.addfooterview(loadinglayout);  

        //给listview添加适配器  

        setlistadapter(adapter);  

        //给listview注册滚动监听  

        listview.setonscrolllistener(this);  

这里面用到了两个layout属性,它们的声明是:

/** 

     * 设置布局显示属性 

     */  

    private layoutparams mlayoutparams =new linearlayout.layoutparams(linearlayout.layoutparams.wrap_content,linearlayout.layoutparams.wrap_content);  

    /** 

     * 设置布局显示目标最大化属性 

    private layoutparams fflayoutparams =new linearlayout.layoutparams(linearlayout.layoutparams.fill_parent,linearlayout.layoutparams.fill_parent);  

       最重要的代码如下:重写了onscroll和onscrollstatechanged两个方法:

@override  

    public void onscroll(abslistview v, int firstvisibleitem,int visibleitemcount, int totalitemcount) {  

        log.v("@@@@@@", "scroll>>>first: " + firstvisibleitem + ", visible: " + visibleitemcount + ", total: " + totalitemcount);  

        lastitem = firstvisibleitem + visibleitemcount - 1;  

        log.i("@@@@@@" , "scroll>>>lastitem:" + lastitem);  

        //显示50条listitem,即0-49,因为onscroll是在“滑动”执行过之后才触发,所以用adapter.count<=41作条件  

        if (adapter.count<=41) {  

            if (firstvisibleitem+visibleitemcount==totalitemcount) {  

                adapter.count += 10;  

                adapter.notifydatasetchanged();  

                listview.setselection(lastitem);  

                log.v("@@@@@@","onscroll  "+adapter.count);  

                int currentpage=adapter.count/10;  

                toast.maketext(getapplicationcontext(), "第"+currentpage+"页", toast.length_long).show();  

        }else {  

             listview.removefooterview(loadinglayout);   

        }         

    @override  

    public void onscrollstatechanged(abslistview v, int state) {  

        if (lastitem == adapter.count && state == onscrolllistener.scroll_state_idle) {  

            log.v("@@@@@@", "scrollstatechanged>>>state:"+state+"lastitem:" + lastitem);  

            if (adapter.count<=41) {  

                log.v("@@@@@@","onscrollstatechanged  "+adapter.count);  

先说下onscroll方法的几个参数的意义:

      官方解释如下:

view

the view whose scroll state is being reported

firstvisibleitem

the index of the first visible cell (ignore if visibleitemcount == 0)

visibleitemcount

the number of visible cells

totalitemcount

the number of items in the list adaptor

firstvisibleitem:当前能看见的第一个列表项id(从0开始)    

visibleitemcount:当前能看见的列表项总数(小半个也算,部分显示的都算)   

totalitemcount:列表项共数

lastitem = firstvisibleitem + visibleitemcount - 1;  

获取最下面那个item的id(position)值.

if (firstvisibleitem+visibleitemcount==totalitemcount) {  

如果listitem个数不足50,继续添加,并把listview的焦点放到最下面的item上。

这样的话,整个就比较容易理解了。

在listview里面还有几个方法:

listview.getfirstvisibleposition()是获得现在屏幕第一个listitem(第一个listitem部分显示也算)

listview.getlastvisibleposition()现时屏幕最后一个listitem(最后listitem要完全显示出来才算)

继续阅读