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提供的参数来判断条件,比如如下代码:
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
int 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。