使用AbsListView OnScrollListener简单实现android ListView的分页

来源:互联网 发布:php 代理教程 编辑:程序博客网 时间:2024/05/20 17:27

  AbsListView的OnScrollListener有两个方法,一个是onScroll,一个是onScrollStateChanged.

public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount)
public void onScrollStateChanged(AbsListView view, int scrollState)


onScroll在AbsListView scroll的时候被回调,所以只要确认当前显示的是否是最后的数据,如果是我们加上footer view,显示加载的信息,启动异步加载任务,当任务结束,remove footer view.在这里我们需要使用到AbsListview的footerView.为了防止发生classcastexception,在AbsListView setAdapter之前需要addFooterView,可以按具体情况分析,因为可能只有单一的一页,根据初次返回的size判断是否需要addFooterView,那么如何确定当前显示的数据已经到达了adapter的最后一行?可以通过onScroll提供的参数来判断条件,比如如下代码:

@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {// TODO Auto-generated method stubint lastVisibleItem = firstVisibleItem + visibleItemCount- mListView.getHeaderViewsCount();this.firstVisibleItem=firstVisibleItem;if (mAdapter != null && lastVisibleItem == mAdapter.getCount()&& mListView.getFooterViewsCount() == 0&& (mTask == null || mTask.isCancelled()) && mHasMore) {mListView.addFooterView(mFooterView);mTask = new GetCommentTask(this);mTask.execute((new Long[] { mAlbumId,commentList.get(commentList.size() - 1).commentId,PULL_DOWN_REQUEST }));}}

需要注意的是onScroll在用户没有采取任何动作的情况下,也会调用onScroll,这是程序内部调用,在初始化absListview的时候,所以需要加上别的判断条件。

附上各个参数的意义:

firstVisibleItem:从0开始,表示当前向下显示的view的顺序,注意如果有header,那么header也会算在里面,因为是从最上面的子view到当前view的顺序。

visibleItemCount:当前可见的view的数量.

totalItemCount:所有的项数,包含header和footer。