拿来就用的 RecyclerView 上拉加载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011133887/article/details/83928118

上拉加载在 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时,说明已经没有更多数据了,我们一样需要调用移除监听器的接口。

猜你喜欢

转载自blog.csdn.net/u011133887/article/details/83928118