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原来还有这样的方法