关闭

一个支持下拉自动加载的recycleview

248人阅读 评论(0) 收藏 举报
public class RecyclerViewOnScroll extends RecyclerView.OnScrollListener {
    RecyclerView.Adapter mMyadputer;
    LodeMoreCallBack mLodeMoreCallBack;
    int lastVisibleItem = 0;
    int firstVisibleItem = 0;


    public RecyclerViewOnScroll(RecyclerView.Adapter mMyadputer, LodeMoreCallBack mLodeMoreCallBack) {
        this.mMyadputer = mMyadputer;
        this.mLodeMoreCallBack = mLodeMoreCallBack;
    }


    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        int totalItemCount = layoutManager.getItemCount();
        if (layoutManager instanceof LinearLayoutManager) {
            LinearLayoutManager linearLayoutManager = ((LinearLayoutManager) layoutManager);
            lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
            firstVisibleItem = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
        } else if (layoutManager instanceof GridLayoutManager) {
            GridLayoutManager gridLayoutManager = ((GridLayoutManager) layoutManager);
            //通过LayoutManager找到当前显示的最后的item的position
            lastVisibleItem = gridLayoutManager.findLastVisibleItemPosition();
            firstVisibleItem = gridLayoutManager.findFirstCompletelyVisibleItemPosition();
        } else if (layoutManager instanceof StaggeredGridLayoutManager) {
            StaggeredGridLayoutManager staggeredGridLayoutManager = ((StaggeredGridLayoutManager) layoutManager);
            //因为StaggeredGridLayoutManager的特殊性可能导致最后显示的item存在多个,所以这里取到的是一个数组
            //得到这个数组后再取到数组中position值最大的那个就是最后显示的position值了
            int[] lastPositions = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];
            staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions);
            lastVisibleItem = findMax(lastPositions);
            firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(lastPositions)[0];
        }


    }


    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        //获取总的适配器的数量
        int totalCount = mMyadputer.getItemCount();
        Log.e("总的数目", totalCount + "");
        Log.e("滚动的状态", newState + "");
        //这个就是判断当前滑动停止了,并且获取当前屏幕最后一个可见的条目是第几个,当前屏幕数据已经显示完毕的时候就去加载数据
        if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == mMyadputer.getItemCount()) {
            //回调加载更多
            mLodeMoreCallBack.LodeMore();
        }
    }
    //找到数组中的最大值


    private int findMax(int[] lastPositions) {


        int max = lastPositions[0];
        for (int value : lastPositions) {
            //       int max    = Math.max(lastPositions,value);
            if (value > max) {
                max = value;
            }
        }
        return max;
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12865次
    • 积分:478
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:60篇
    • 译文:0篇
    • 评论:2条
    文章分类
    名人博客
    http://blog.csdn.net/lmj623565791 http://blog.csdn.net/guolin_blog
    最新评论