Android中Recyclerview分页加载

通过添加Recyclerview的OnScrollListener来判断Recyclerview是否滑动到底部

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        //当前RecyclerView显示出来的最后一个的item的position
        int lastPosition = -1;
 
        //当前状态为停止滑动状态SCROLL_STATE_IDLE时
        if(newState == RecyclerView.SCROLL_STATE_IDLE){
            RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
            if(layoutManager instanceof GridLayoutManager){
                //通过LayoutManager找到当前显示的最后的item的position
                lastPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();
            }else if(layoutManager instanceof LinearLayoutManager){
                lastPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
            }else if(layoutManager instanceof StaggeredGridLayoutManager){
                //因为StaggeredGridLayoutManager的特殊性可能导致最后显示的item存在多个,所以这里取到的是一个数组
                //得到这个数组后再取到数组中position值最大的那个就是最后显示的position值了
                int[] lastPositions = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];
                ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(lastPositions);
                lastPosition = findMax(lastPositions);
            }
 
            //时判断界面显示的最后item的position是否等于itemCount总数-1也就是最后一个item的position
            //如果相等则说明已经滑动到最后了
            if(lastPosition == recyclerView.getLayoutManager().getItemCount()-1){
                Toast.makeText(RecyclerActivity.this, "滑动到底了", Toast.LENGTH_SHORT).show();
            }
 
        }
    }
 
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
 
    }
 
});

findMax方法:

//找到数组中的最大值
 private int findMax(int[] lastPositions) {
        int max = lastPositions[0];
        for (int value : lastPositions) {
            if (value > max) {
                max = value;
            }
        }
        return max;
    }

这样写有一个bug,当最后一个item刚显示出来的时候停止滑动这个时候也会触发滑动到底部的操作,有时候我们可能并不希望这,希望当Recyclerview确实是滑动到底部滑动不了的时候才触发

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {...}
 
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
 
        //得到当前显示的最后一个item的view
        View lastChildView = recyclerView.getLayoutManager().getChildAt(recyclerView.getLayoutManager().getChildCount()-1);
        //得到lastChildView的bottom坐标值
        int lastChildBottom = lastChildView.getBottom();
        //得到Recyclerview的底部坐标减去底部padding值,也就是显示内容最底部的坐标
        int recyclerBottom =  recyclerView.getBottom()-recyclerView.getPaddingBottom();
        //通过这个lastChildView得到这个view当前的position值
        int lastPosition  = recyclerView.getLayoutManager().getPosition(lastChildView);
 
        //判断lastChildView的bottom值跟recyclerBottom
        //判断lastPosition是不是最后一个position
        //如果两个条件都满足则说明是真正的滑动到了底部
        if(lastChildBottom == recyclerBottom && lastPosition == recyclerView.getLayoutManager().getItemCount()-1 ){
            Toast.makeText(RecyclerActivity.this, "滑动到底了", Toast.LENGTH_SHORT).show();
        }
    }
 
});

上面的代码是在onScrolled的回调中获取layoutManager最后一个childView,获得childView的底部坐标和当前childView的position值,判断childView的底部坐标是否跟Recyclerview的底部坐标相等以及当前position是否是最后一个position值,如果都满足的话说明是真正的滑动到底部了。
注意:上面的判断是在onScrolled中书写的,每滑动一下都会去判断一次,也可以将这段代码放到onScrollStateChanged回调中当停止滑动的时候再去判断,类似于第一种方法那样。可以根据具体的业务需求进行修改

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值