一、介绍
一个实现了下拉刷新,滚动到底部加载更多以及添加header功能的的RecyclerView。
使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater。
加载效果内置了AVLoadingIndicatorView上的所有效果,可以根据需要指定。
项目地址:https://github.com/jianghejie/XRecyclerView
基本上主流的下拉效果都有了
二、改进
1、支持两种头部布局,即单纯的刷新和上下翻页的布局
2、在XRecycleView里实现了翻页的变量,外部不只需要很少的代码就能控制请求的开始位置
3、对XRecycleView的设置进行封装,也可以单个调用
三、代码
1、支持两种头部布局,即单纯的下拉刷新和上下翻页的布局和封装
/**
* @param context
* @param isLittleHeader true表示上下翻页,false下拉刷新
*/
public tztXRecyclerView(Context context, boolean isLittleHeader) {
super(context);
mIsLittleHeader = isLittleHeader;
init();
//公共的属性设置
setCommParam();
}
/**
* 设置tztXRecyclerView的公共默认参数,也可以单独设置
* @return
*/
private void setCommParam(){
//设置tztRecyclerView不能下拉刷新
//mDetailListView.setPullRefreshEnabled(false);
setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
//设置tztXRecyclerView上拉加载更多
setLoadingMoreProgressStyle(ProgressStyle.BallSpinFadeLoader);
//设置tztXRecyclerView下拉刷新即上一页的效果图片
setArrowImageView(R.drawable.tzt_xrecycleview_iconfont_downgrey);
//设置tztXRecyclerView加载到最后一页再上拉的提示信息
//getDefaultFootView().setNoMoreHint("加载完毕");
//设置tztXRecyclerView下拉刷新时间提示
getDefaultRefreshHeaderView().setRefreshTimeVisible(false);
setLimitNumberToCallLoadMore(2);
//是否允许显示加载更多
//setLoadingMoreEnabled(false);
}
2、在XRecycleView里实现了翻页的变量,外部不只需要很少的代码就能控制请求的开始位置
//数据请求开始位置
public int mStartPos = 0;
//一共返回多少条数据
public int mMaxCount;
//一共有多少页数据
public int mPagesCount;
//当前是在第几页
public int mPagesNow = 1;
/**
* 计算页数信息
* @param refreshType 1上拉刷新2下来加载更多
* @param maxCount 总共记录数 maxCount=-1表示请求失败
*/
public void completeLoad(int refreshType, int maxCount){
if (refreshType == 2) {
loadMoreComplete();
if(maxCount >= 0) {
scrollToPosition(0);
}
} else if (refreshType == 1) {
refreshComplete();
}
//获取一共返回多少条数据
if(maxCount >= 0) {
mMaxCount = maxCount;
if (getReqMaxCount() > 0 && mMaxCount > 0) {
if (getReqMaxCount() % mMaxCount == 0) {
mPagesCount = mMaxCount / getReqMaxCount();
} else {
mPagesCount = mMaxCount / getReqMaxCount() + 1;
}
}
}
}
/**
* 每页条数,必须实现
* @return
*/
public int getReqMaxCount(){
return 100;
}
@Override
public void onScrollStateChanged(int state) {
super.onScrollStateChanged(state);
if (state == RecyclerView.SCROLL_STATE_IDLE && mLoadingListener != null && !isLoadingData && loadingMoreEnabled) {
......
{
isLoadingData = true;
if (mFootView instanceof LoadingMoreFooter) {
((LoadingMoreFooter) mFootView).setState(LoadingMoreFooter.STATE_LOADING);
} else {
if(footerViewCallBack != null){
footerViewCallBack.onLoadingMore(mFootView);
}
}
//翻页代码
if (mPagesNow < mPagesCount) {
mStartPos = mStartPos + getReqMaxCount();
//请求下一页数据
if(mLoadingListener != null) {
mLoadingListener.onLoadMore(mStartPos, 2);
}
mPagesNow++;
return;
} else {
setNoMore(true);
loadMoreComplete();
}
}
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
......
default:
mLastY = -1; // reset
if (isOnTop() && pullRefreshEnabled && appbarState == AppBarStateChangeListener.State.EXPANDED) {
if (mRefreshHeader != null && mRefreshHeader.releaseAction()) {
//翻页代码
mStartPos = mStartPos - getReqMaxCount();
if(mStartPos < 0){
mStartPos = 0;
}
//请求上一页数据
if (mLoadingListener != null) {
mLoadingListener.onRefresh(mStartPos, 1);
}
//
if(mPagesNow > 0) {
mPagesNow--;
}
}
}
break;
}
return super.onTouchEvent(ev);
}
三、具体调用
public void onInit() {
//isLittleHeader true表示上下翻页,false下拉刷新、
mDetailListView = new tztXRecyclerView(Rc.getApplication(), true)
//上拉加载更多和下拉刷新的监听事件
mDetailListView.setLoadingListener(new tztXRecyclerView.LoadingListener() {
@Override
public void onRefresh(int startpos, final int refreshType) {
//请求上一页数据
doCreateReq(false, startpos, refreshType);
}
@Override
public void onLoadMore(int startpos, final int refreshType) {
//请求下一页数据
doCreateReq(false, startpos, refreshType);
}
});
}
public void doCreateReq(final boolean isBg, int startpos, final int refreshType) {
tztRequest_Detail request_Detail = new tztRequest_Detail(null) {
@Override
public void doRefreshUI(final tztReqBase j, final tztNewDetailBean bean) {
post(new Runnable() {
@Override
public void run() {
//设置翻页的总条数、关闭刷新或者加载更多的动画
mDetailListView.completeLoad(refreshType, bean.getMaxCount());
tztTrendLandscapeDetailView.this.doRefreshUI(j, bean);
}
});
}
};
request_Detail.mStockCode = mPankouCallBack.getStockStruct().getStockCode();
request_Detail.mNewMarketNo = mPankouCallBack.getStockStruct().getStockType() + "";
request_Detail.mStartPos = startpos;
request_Detail.mMaxCount = mReqMaxCount;
request_Detail.sendRequest(isBg);
}