android 列表上拉加载更多、下拉刷新

加载更多:通过继承列表view的onScrollListener 监听,重写onScroll,在这里实现加载更多的逻辑;是否触发加载更多的逻辑其判断条件为列表是否滑动到最底部就可以了,最底部就触发加载更多,否则就不触发。

以RecyclerView 为例:

核心代码

public abstract class RecycleLoadMoreScorllerListener extends RecyclerView.OnScrollListener {

    private int mCurrentPage ;

    private boolean mIsLoading = false;

    private boolean mIsCanLoadMore ;

    private RecyclerView mRecyclerView;

    public RecycleLoadMoreScorllerListener(RecyclerView recyclerView){
        super();
        mRecyclerView = recyclerView;
    }

    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (mIsCanLoadMore){
            //已滑动到最底部
            if (isSlideToBottom()) {
                mCurrentPage++;
                onLoadMore(mCurrentPage);
                //mIsLoading = true;
            }
        }
    }

    /**
     *  是否滑动到最底部
     *
     *  !isLoading, 不在加载过程中
     *  lastVisibleItemPosition == totalItemCount - 1, 当前可见的最后一个item是列表的最后一个
     *
     * @return
     */
    private boolean isSlideToBottom() {
        if (mRecyclerView == null) {
            return false;
        }
        RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
        if (layoutManager instanceof LinearLayoutManager) {
            int visibleItemCount = layoutManager.getChildCount();
            int totalItemCount = layoutManager.getItemCount();
            int lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
            return !mIsLoading && visibleItemCount > 0 && lastVisibleItemPosition == totalItemCount - 1;
        }
        return false;
    }


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

    //抽象方法,用来传递加载更多事件
    public abstract void onLoadMore(int currentPage);

    public void setCanLoadMore(boolean load) {
        mIsCanLoadMore = load;
    }

    public void setLoading(boolean load) {
        mIsLoading = load;
    }
}

写完这个监听后,在adapter 或者是界面中使用都可以,比如说在adapter中去使用(这种方式针对recycleView 可以的,因为在创建adapter时,这些方法一定会走到),

   @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        mRecycleLoadMoreScorllerListener = new RecycleLoadMoreScorllerListener(recyclerView) {
            @Override
            public void onLoadMore(int currentPage) {
                Log.i("loadingtest", "currentPage: " + currentPage);
                mOnLoadMoreListener.onLoadMore(currentPage);
            }
        };
        recyclerView.addOnScrollListener(mRecycleLoadMoreScorllerListener);

        //初始化的时候如果未填满一页,那么肯定就没有更多数据了
        if (mStrings.size() < PER_PAGE) {
            setCanLoadMore(false);
        } else {
            setCanLoadMore(true);
        }
    }

    @Override
    public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onDetachedFromRecyclerView(recyclerView);
        if (mRecycleLoadMoreScorllerListener != null) {
            recyclerView.removeOnScrollListener(mRecycleLoadMoreScorllerListener);
        }
        mRecycleLoadMoreScorllerListener = null;
    }

    /*
     * 数据加载完毕时执行setCanLoadMore(),此时isLoading都置为false
     * */
    public void setCanLoadMore(boolean isCanLoadMore) {
        this.isCanLoadMore = isCanLoadMore;
        mRecycleLoadMoreScorllerListener.setCanLoadMore(isCanLoadMore);
        mRecycleLoadMoreScorllerListener.setLoading(false);
    }

    //这里是通过接口把其拓展出去
   public interface OnLoadMoreListener {
        void onLoadMore(int currentPage);
    }

    private OnLoadMoreListener mOnLoadMoreListener;

    public void setOnLoadMoreListener(OnLoadMoreListener listener) {
        this.mOnLoadMoreListener = listener;
    }

然后,adpater.setOnLoadMoreListener(new Adapter.OnLoadMoreListener(){

       ..... 实现相关逻辑

});

或者在acitivity中,recylceView绑定onScrollListener监听,这样也是可以的。


参考文章:https://www.jianshu.com/p/68bc80fc555c  (大致的思路可以参考一下);

还要周文凯的系列文章 

https://blog.csdn.net/xuehuayous/article/details/50394946; 

http://blog.csdn.net/xuehuayous/article/details/50498345;

http://blog.csdn.net/xuehuayous/article/details/50387089

猜你喜欢

转载自blog.csdn.net/sjh_389510506/article/details/87284763