三个代码都是从网上下载来的,但是导入到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要完全显示出来才算)