美文网首页Android开发Android技术知识Android开发
[30] —— 拿来就用的 RecyclerView 上拉加载

[30] —— 拿来就用的 RecyclerView 上拉加载

作者: junerver | 来源:发表于2018-11-10 08:46 被阅读16次

    上拉加载在 RecyclerView 中应用已经十分普遍,很多封装好的 RecyclerView 框架中也都有集成该功能,但如果我们只是想在一个页面中实现改功能,引入一个第三方框架显然是不划算的。

    闲言少叙书归正传:
    OnLoadMoreListener.java

    
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    
    public abstract class OnLoadMoreListener extends RecyclerView.OnScrollListener {
    
        private LinearLayoutManager layoutManager;
        private int itemCount, lastPosition, lastItemCount;
        private boolean loadEnable = true;
    
        public abstract void onLoadMore();
    
        /**
         * 允许加载更多,在回调函数中处理
         */
        public void enableLoadMore() {
            loadEnable = true;
        }
    
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
                layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
    
                itemCount = layoutManager.getItemCount();
                lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
            } else {
                Log.e("OnLoadMoreListener", "The OnLoadMoreListener only support LinearLayoutManager");
                return;
            }
    
            if (lastPosition>= itemCount - 2 && dy > 0) {
                if (loadEnable) {
                    this.onLoadMore(); //在回调中处理
                    loadEnable = false;
                }
            }
        }
    }
    

    使用方法十分简单:

    mOnLoadMoreListener=new OnLoadMoreListener() {
                @Override
                public void onLoadMore() {
                    Logger.d("请求加载更多"+minId);
                    getMoreData();
                }
            };
    mRecyclerView.addOnScrollListener(mOnLoadMoreListener);
    
    ...
    
     private void getMoreData() {
            OkHttpUtils.post()
                    .url(URL.LIST_MORE)
                    .params(parp)
                    .build()
                    .execute(new StringCallback() {
                        @Override
                        public void onError(Call call, Exception e, int id) {
                            
                        }
    
                        @Override
                        public void onResponse(String response, int id) {
                            ....
                            mAdapter.notifyDataSetChanged();
                            mOnLoadMoreListener.enableLoadMore(); //在网络请求完毕列表数据刷新后调用允许再次加载
                        }
                    });
    
    

    关闭

    我们应该首先与后台确定好接口一次返回的数据数量(比如定为10),如果我们首次请求时,数据返回的数量小于这个值,则需要调用mRecyclerView.removeOnScrollListener(mOnLoadMoreListener);

    同理在请求更多数据接口也是一样的处理,当接口返回数据量小于10时,说明已经没有更多数据了,我们一样需要调用移除监听器的接口。

    相关文章

      网友评论

        本文标题:[30] —— 拿来就用的 RecyclerView 上拉加载

        本文链接:https://www.haomeiwen.com/subject/uaaaxqtx.html