本篇博客是要在上拉刷新下拉加载的基础上实现预加载功能,传统的XListView都是当数据加载到最后一天数据的时候在上拉加载数据,实现预加载也就是加入一页数据是二十条,当滑动到15条数据的时候自动加载下页数据(这个当滑动到倒数几条数据在进行自动加载可以根据自己的需求来设置),下面我们就来通过OnScrollListener来实现一把。
一、介绍一下OnScrollListener
OnScrollListener
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
可以看到,OnScrollListener接口有三个静态滚动状态的变量,及两个要实现的方法。
onScrollStateChanged
滚动状态发生变化时,系统会回调这个方法。滚动状态会被赋值到scrollState,scrollState的值如下:
scrollState值 | 含义 |
---|---|
SCROLL_STATE_IDLE | 不滚动时的状态,通常会在滚动停止时监听到此状态 |
SCROLL_STATE_TOUCH_SCROLL | 正在滚动的状态 |
SCROLL_STATE_FLING | 用力快速滑动时可监听到此值 |
onScroll
滚动过程中会回调此方法。详细的参数含义:
onScroll方法参数 | 含义 |
---|---|
firstVisibleItem | 第一个可视的项,这里是整个item都可视的项。被挡住一点都不符合 |
visibleItemCount | 可视的项的个数 |
totalItemCount | 总item的个数 |
介绍完OnScrollListener之后实现XListView预加载就超级简单了。
第一步、首先创建自动加载的监听,在XListView中写就好
/** * 预加载 接口 */ public interface OnPreLoadListener { void onPreLoad(); } /** * 预加载监听 * @param onPreLoadListener */ public void setOnPreLoadListener(OnPreLoadListener onPreLoadListener) { this.onPreLoadListener = onPreLoadListener; }
第二步、在XListView中的onScrollStateChanged方法记录滑动状态
@Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (mScrollListener != null) { mScrollListener.onScrollStateChanged(view, scrollState); } //全局记录滑动状态 this.scrollState = scrollState; }第三步、在XListView中的onScrollStateChanged方法记录滑动状态
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // send to user's listener mTotalItemCount = totalItemCount; if (mScrollListener != null) { mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } if (totalItemCount - ScrollTag == (firstVisibleItem + visibleItemCount) && oldTotalItemCount != totalItemCount && onPreLoadListener != null) { switch (scrollState) { case SCROLL_STATE_IDLE: case SCROLL_STATE_TOUCH_SCROLL: case SCROLL_STATE_FLING: oldTotalItemCount = totalItemCount; //触发加载数据监听 onPreLoadListener.onPreLoad(); break; } } }中间用到的全局变量//滑动到XListView倒数几条时自动加载数据 private int ScrollTag = 5 ; //全局滑动状态 private int scrollState; //上次XListView的总条目 private int oldTotalItemCount = -1;这样我们就完成了对XListView的任务,现在只需要实现对XListView的setOnPreLoadListener的监听即可。第四步:xList.setOnPreLoadListener(this);实现onPreLoad方法,在onPreLoad中请求数据刷新列表即可,但注意,使用了自动加载后,上拉加载的监听中就不需要请求数据了,否则会出现数据重复的现象。
@Override public void onPreLoad() { page++; //请求数据 getData(page); }就这些,希望对大家伙有帮助。