PullToRefreshRecyclerView源码学习

本文详细介绍了PullToRefreshRecyclerView的源码学习,包括控件简介、设置空视图、添加头部和底部视图的实现原理。下拉刷新依赖于SwipeRefreshLayout,而上滑加载更多则是通过监听RecyclerView的滚动事件OnScrollListener来实现。通过阅读源码,可以更深入理解RecyclerView的使用和自定义功能。
摘要由CSDN通过智能技术生成

PullToRefreshRecyclerView源码学习

控件简介

PullToRefreshRecyclerView是实现了下拉刷新与上滑加载更多功能的recyclerView,并且可自定义加载的view。这两个功能也是如今数据展现的必备功能了,传统的多以ListView实现,如果你想更加了解recyclerview特性或者你的项目想完全替换ListView使用recyclerview,那这个控件源码很值得学习。(ps:我这个伸手党通过阅读项目源码对recyclerview的使用理解更深了,推荐大家都去看看)

可设置的接口


public interface PrvInterface{
   
    void setOnRefreshComplete();//设置刷新完成
    void setOnLoadMoreComplete();//onFinishLoading,加载更多完成
    void setPagingableListener(PullToRefreshRecyclerView.PagingableListener pagingableListener);//设置上滑更多监听回调
    void setEmptyView(View emptyView);//设置EmptyView
    void setAdapter(RecyclerView.Adapter adapter);
    void addHeaderView(View view);//添加header
    void removeHeader();//移除header
    void setFooter(View view);
    void setLoadMoreFooter(BaseLoadMoreView loadMoreFooter);
    void addOnScrollListener(PullToRefreshRecyclerView.OnScrollListener onScrollLinstener);
    RecyclerView.LayoutManager getLayoutManager();
    void onFinishLoading(boolean hasMoreItems, boolean needSetSelection);
    void setSwipeEnable(boolean enable);//设置是否可以下拉
    boolean isSwipeEnable();//返回当前组件是否可以下拉
    RecyclerView getRecyclerView();
    void setLayoutManager(RecyclerView.LayoutManager layoutManager);
    void setLoadMoreCount(int count);//如果不达到count数量不让加载更多
    void release();
}

setEmptyView

我们都知道ListView有个setEmptyView的方法,很方便使用。可惜的是recyclerview并没有,需要自己去实现,该控件实现方式是通过重写RecyclerView.AdapterDataObserver的onChanged方法实现的,通过类名一看也大概了解是监听adapter数据变化的
代码实现如下:

    private class AdapterObserver extends RecyclerView.AdapterDataObserver{
   
        @Override
        public void onChanged() {
            super.onChanged();
            //adapter has change
            if(mRecyclerView == null){
                //here must be wrong ,recyclerView is null????
                return;
            }
            RecyclerView.Adapter<?> adapter =  mRecyclerView.getAdapter();
            if(adapter != null && mEmptyView != null) {
                //如果adapter数据为空
                if(adapter.getItemCount() == 0) {
                    //设置的是否刷新的标志位
                    if(mIsSwipeEnable) {
                        PullToRefreshRecyclerView.this.setEnabled(false);
                    }
                    //将我们设置的EmptyViwe进行显示
                    mEmptyView.setVisibility(View.VISIBLE);
                    mRecyclerView.setVisibility(View.GONE);
                }
                else {
                    if(mIsSwipeEnable) {
                        PullToRefreshRecyclerView.this.setEnabled(true);
                    }
                    mEmptyView.setVisibility(View.GONE);
                    mRecyclerView.setVisibility(View.VISIBLE);
                }
            }
        }
    }

使用也很简单,registerAdapterDataObserver设置我们自定义dataObserver的就ok了

    public void setAdapter(RecyclerView.Adapter adapter) {
        mRecyclerView.setAdapter(adapter);
        if(mAdapterObserver == null){
            mAdapterObserver = new AdapterObserver();
        }
        if(adapter != null){
            adapter.registerAdapterDataObserver(mAdapterObserver);
            mAdapterObserver.onChanged();
        }
    }

通过代码实现发现逻辑是很简单的,但是我们知道了recyclerview原来还有这样的方法

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值