副标题#e#
我将这个扩展的RecyclerView命名为EnhanceRecyclerView,继承RecyclerView。我们知道既然要实现下拉刷新与上拉更多自然先要实现头部与尾部的布局,所以我们先利用前面的知识来为EnhanceRecycleView添加header与footer
public void initView() {
View headerView = LayoutInflater.from(getContext()).inflate(R.layout.head_layout, null);
View footerView = LayoutInflater.from(getContext()).inflate(R.layout.footer_layout, null);
addHeaderView(headerView);
addFooterView(footerView);
}
其中的布局文件就不多说了,至于addHeaderView与addFooterView方法可以查看我前面的那篇文章,有详细的介绍
设置监听器
既然要实现下拉刷新与上拉加载,自然少不了对监听器的处理,所以下面来详细介绍下对监听器OnScrollListener与OnTouchListener的处理。
OnScrollListener
为EnhanceRecyclerView添加addOnScrollListener实现其中的onScrollStateChanged与onScrolled方法。
onScrolled
在onScrolled中我们主要做的是获取EnhanceRcyclerView中item的总数量、视图显示中的***个item在EnhanceRecyclerView中所处的位置与视图显示中***一个item在EnhanceRecyclerView中所处的位置。
对于item的总数量很好获取直接调用
totalCount = getLayoutManager().getItemCount();
由于RecyclerView能实现LinearLayoutManager、GridLayoutManager与StaggeredGridLayoutManager不同的布局,所以另外两个要根据不同的manager来获取,还是看具体代码吧
if (getLayoutManager() instanceof LinearLayoutManager) {
lastItem = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition();
firstVisible = ((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition();
} else {
into = ((StaggeredGridLayoutManager) getLayoutManager()).findLastVisibleItemPositions(into);
firstInto = ((StaggeredGridLayoutManager) getLayoutManager()).findFirstVisibleItemPositions(firstInto);
lastItem = into[0];
firstVisible = firstInto[0];
}
onScrollStateChanged
获取到了那三个关键数据以后,就可以在onScrollStateChanged中实现具体的逻辑,在这个方法中主要实现的是对上拉加载更多的处理
if (lastItem == adapter.getItemCount() + 1 && newState == RecyclerView.SCROLL_STATE_IDLE && !isLoad) {
ViewGroup.LayoutParams params = getFooterView(0).getLayoutParams();
params.width = RecyclerView.LayoutParams.MATCH_PARENT;
params.height = RecyclerView.LayoutParams.WRAP_CONTENT;
getFooterView(0).setLayoutParams(params);
#p#副标题#e#
getFooterView(0).setVisibility(View.VISIBLE);
smoothScrollToPosition(totalCount);
isLoad = true;
loadMoreListener.onLoadMore();
}
if (firstVisible == 0) {
isTop = true;
} else {
isTop = false;
#p#副标题#e##p#分页标题#e#
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) getHeaderView(0).getLayoutParams();
params.width = RecyclerView.LayoutParams.MATCH_PARENT;
params.height = RecyclerView.LayoutParams.WRAP_CONTENT;
params.setMargins(0, -getHeaderView(0).getHeight(), 0, 0);
getHeaderView(0).setLayoutParams(params);
}
简单说明下,核心就是判断lastItem是否处在***的位置,如果是的话就继续加载更多的操作,这里提供了一个对数据处理的接口所以只要实现loadMoreListener.onLoadMore();即可。