RecyclerView的两种加载更多的写法比较

关于RecyclerView的加载更多(重写RecyclerView.OnScrollListener),网上广泛有两种写法,来分析下两种写法的优劣: 1. 第一种,代码以下,这种方法的原理是当RecyclerView持有的Item数量减去可见的Item数量后数目小于等于第一个可见Item,那么列表就是能够调用onLoadMore这个方法的,看上去颇有道理,假如手机一屏刚好是四个Item都显示出来了,这个时候itemCount和previousItemCount是相等的,这个时候isRefreshing恒等于false,因此不管如何都是不会调用onLoadMore的.ide

/**
     * 用于RecyclerView加载更多的监听器
     */
    public abstract class OnLoadMoreListener extends RecyclerView.OnScrollListener {
        private int lastVisibleItem;

        private int itemCount;//全部的Item个数
        private int visibleItemCount;//可见Item的个数
        private int firstVisibleItem;//第一个可见的Item 的position
        private int previousItemCount;//滑动以前的Item数目

        private boolean isRefreshing = true;

        /**
         * 重写此抽象方法,实现加载更多
         */
        protected abstract void onLoadMore();


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

            itemCount = getLayoutManager().getItemCount();
            visibleItemCount = recyclerView.getChildCount();
            if (getLayoutManager() instanceof LinearLayoutManager) {
                firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
            }

            if (isRefreshing) {
                if (itemCount > previousItemCount) {
                    isRefreshing = false;
                    previousItemCount = itemCount;
                }
            }

            if (!isRefreshing && (itemCount - visibleItemCount) <= firstVisibleItem) {
                onLoadMore();//加载更多的逻辑写在这个方法里,好比请求数据
                isRefreshing = true;
            }
        }
    }
2. 第二种,代码以下,原理就是当RecyclerView中止滑动的时候,判断最后一个Item的Position+1是否等于Item的总数量,是就下拉加载更多,这种的话,我的认为是比较合理的加载更多的写法:
private class OnLoadMoreListener extends RecyclerView.OnScrollListener{

    private int lastVisibleItem;
    private int itemCount;

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);


            if (newState == RecyclerView.SCROLL_STATE_IDLE){
                        
            if (lastVisibleItem + 1 == itemCount && newState == RecyclerView.SCROLL_STATE_IDLE){
                onloadMore();
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            lastVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition();
            itemCount = recyclerView.getAdapter().getItemCount();
        }
    }
相关文章
相关标签/搜索