XListView实现仿今日头条预加载

本篇博客是要在上拉刷新下拉加载的基础上实现预加载功能,传统的XListView都是当数据加载到最后一天数据的时候在上拉加载数据,实现预加载也就是加入一页数据是二十条,当滑动到15条数据的时候自动加载下页数据(这个当滑动到倒数几条数据在进行自动加载可以根据自己的需求来设置),下面我们就来通过OnScrollListener来实现一把。


一、介绍一下OnScrollListener

OnScrollListener
 public interface OnScrollListener {
     public static int SCROLL_STATE_IDLE = 0;
     public static int SCROLL_STATE_TOUCH_SCROLL = 1;
     public static int SCROLL_STATE_FLING = 2;

     public void onScrollStateChanged(AbsListView view, int scrollState);
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
               int totalItemCount);
 }
 
 
  • 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);
}
就这些,希望对大家伙有帮助。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值