HardBirch

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

时间:12-02-27 栏目:安卓源码解析与小应用 作者:张飞不张,文采横飞 评论:2 点击: 2,587 次

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

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

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

class listViewAdapter extends BaseAdapter {
		int count = 10;

		public int getCount() {
			return count;
		}

		public Object getItem(int pos) {
			return pos;
		}

		public long getItemId(int pos) {
			return 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) {
				adapter.count += 10;
				adapter.notifyDataSetChanged();
				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

  1. firstVisibleItem:当前能看见的第一个列表项ID(从0开始)    
  2. visibleItemCount:当前能看见的列表项总数(小半个也算,部分显示的都算)   
  3. totalItemCount:列表项共数

lastItem = firstVisibleItem + visibleItemCount - 1;

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

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();
			}

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

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



在listview里面还有几个方法:

listView.getFirstVisiblePosition()是获得现在屏幕第一个ListItem(第一个ListItem部分示也算)

listView.getLastVisiblePosition()现时屏幕最后一个ListItem(最后ListItem要完全显示出来才算)


  代码下载地址如下:,http://download.csdn.net/detail/aomandeshangxiao/4094237http://download.csdn.net/detail/aomandeshangxiao/4094244

http://download.csdn.net/detail/aomandeshangxiao/4094250一共三个demo,感兴趣的可以先看下。这些demo均是从网上下载而来,供学习只用。

后面还会有另外两个例子的解析,分别是:listView下拉刷新(sina微博Android客户端效果)listView下拉刷新2

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: listView滑动刷新代码(分页功能)

listView滑动刷新代码(分页功能):目前有2 条留言

  1. 板凳
    wcgebxtim:

    关于ListView的滚动监听有一些地方你描述的不太准确,

    2012-08-05 16:44 [回复]
  2. 沙发
    wcgebxtim:

    楼主你运行一下这个ListView试试看这个效果是不是不对,滚动一下两次加载,statechange和onscroll都有加载新数据,

    2012-08-05 17:15 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐