RecyclerView检测是否滑动到底部

本文介绍了一种自定义RecyclerView的方法,能够有效检测滑动是否到达底部,适用于使用LinearLayoutManager和StaggeredGridLayoutManager布局管理器的情况。文章提供了一个自定义的MyRecyclerView类,能够根据不同类型的布局管理器调整其检测策略。

上一个博客http://blog.youkuaiyun.com/oaitan/article/details/51165894

用到了recyclerview滑动到底部,

用的是LinearLayoutManager这个属性,当用到瀑布流的时候这个方法肯定不行了

用StaggeredGridLayoutManager这个属性因为item高低不一样,以前的老方法肯定就不行了,现在通过自定义recyclerView去检测是否滑动到底部,不管是这两个属性哪一个都可以检测到是否滑动到了底部

/**
 * by 12406 on 2016/5/12.
 */
public class MyRecyclerView extends RecyclerView {


    public enum LAYOUT_MANAGER_TYPE {
        LINEAR,
        GRID,
        STAGGERED_GRID
    }

    private LAYOUT_MANAGER_TYPE layoutManagerType;

    /**
     * 最后一个的位置
     */
    private int[] lastPositions;

    /**
     * 最后一个可见的item的位置
     */
    private int lastVisibleItemPosition;

    private LoadingData loadingData;


    public void setLoadingData(LoadingData loadingData) {
        this.loadingData = loadingData;
    }


    public MyRecyclerView(Context context) {
        super(context);
    }

    public MyRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public MyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }


    @Override
    public void onScrolled(int dx, int dy) {
        super.onScrolled(dx, dy);

        LogUtils.i("onScrolled", dx + "   " + dy);

        RecyclerView.LayoutManager layoutManager = getLayoutManager();
        if (layoutManagerType == null) {
            if (layoutManager instanceof LinearLayoutManager) {
                layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR;
            } else if (layoutManager instanceof StaggeredGridLayoutManager) {
                layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID;
            } else {
                throw new RuntimeException(
                        "Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager");
            }
        }

        switch (layoutManagerType) {
            case LINEAR:
                lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
                break;
            case GRID:
                lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();
                break;
            case STAGGERED_GRID:
                StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
                if (lastPositions == null) {
                    lastPositions = new int[staggeredGridLayoutManager.getSpanCount()];
                }
                staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions);
                lastVisibleItemPosition = findMax(lastPositions);
                break;
        }
    }


    @Override
    public void onScrollStateChanged(int state) {
        super.onScrollStateChanged(state);
        RecyclerView.LayoutManager layoutManager = getLayoutManager();
        int visibleItemCount = layoutManager.getChildCount();
        int totalItemCount = layoutManager.getItemCount();
        LogUtils.i("onScrollStateChanged", "visibleItemCount" + visibleItemCount);
        LogUtils.i("onScrollStateChanged", "lastVisibleItemPosition" + lastVisibleItemPosition);
        LogUtils.i("onScrollStateChanged", "totalItemCount" + totalItemCount);
        if (visibleItemCount > 0 && state == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItemPosition == totalItemCount - 1 && loadingData != null) {
            loadingData.onLoadMore();
        }
    }

    private int findMax(int[] lastPositions) {
        int max = lastPositions[0];
        for (int value : lastPositions) {
            if (value > max) {
                max = value;
            }
        }
        return max;
    }

    public interface LoadingData {

        void onLoadMore();

    }
}
自定义个接口当滑动到底部的时候会触发这个方法

我用的自带的下拉刷新,有个isRefreshing(),返回是否在下拉刷新,

 @Override
    public void onLoadMore() {
        if (!srfLayout.isRefreshing()) {
            LogUtils.i("MainFragment", "recyclerview到底了");
        }
    }




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值