最近需要用到下拉上拉功能,又不用SwipeRefreshLayout。网上找了半天都不太理想,于是找了一个第三方自己修改了一下。
UI没有调整,大家可以根据自己的需要优化。
结构如下:
- 头部容器
1、HeaderView
public void setState(int state) {
//如果状态相同 直接返回
switch (state) {
case STATE_NORMAL://正常状态
mHintTextView.setText("下拉刷新");
break;
case STATE_READY://可以刷新状态
if (mState != STATE_READY) {
mHintTextView.setText("松开刷新数据");
}
break;
case STATE_REFRESHING://刷新状态
mHintTextView.setText("正在加载...");
break;
default:
}
mState = state;
}
2、FooterView
public void setState(int state) {
hintView.setVisibility(View.INVISIBLE);
progressBar.setVisibility(View.INVISIBLE);
hintView.setVisibility(View.INVISIBLE);
if (state == STATE_READY) {
hintView.setVisibility(View.VISIBLE);
hintView.setText("松开载入更多");
} else if (state == STATE_LOADING) {
progressBar.setVisibility(View.VISIBLE);
} else {
hintView.setVisibility(View.VISIBLE);
hintView.setText("查看更多");
}
}
/**
* 设置距离下边的BottomMargin
* @param height
*/
public void setBottomMargin(int height) {
if (height < 0) return;
LayoutParams lp = (LayoutParams) contentView.getLayoutParams();
lp.bottomMargin = height;
contentView.setLayoutParams(lp);
}
- RecyclerView
@Override
public boolean onTouchEvent(MotionEvent e) {
if (mLastY == -1) {
mLastY = e.getRawY();
}
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
//按下的时候记录值
mLastY = e.getRawY();
break;
case MotionEvent.ACTION_MOVE:
float moveY = e.getRawY();
//手指滑动的差值
float distanceY = moveY - mLastY;
mLastY = moveY;
//第一个条目完全显示 //头部高度大于0 deltaY大于0 向下移动
if ((((LinearLayoutManager) getLayoutManager()).findFirstCompletelyVisibleItemPosition() == 0
|| ((LinearLayoutManager) getLayoutManager()).findFirstCompletelyVisibleItemPosition() == 1)
&& (mHeaderView.getVisibleHeight() > 0 || distanceY > 0)) {
// 更新头部高度
updateHeaderHeight(distanceY / OFFSET_RADIO);
} else if (isSlideToBottom() && (mFooterView.getBottomMargin() > 0 || distanceY < 0)) {
//已经到达底部,改变状态或者自动加载
updateFooterHeight(-distanceY / OFFSET_RADIO);
} else if (distanceY > 0) {
updateFooterHeight(-distanceY / OFFSET_RADIO);
}
break;
default:
mLastY = -1; // 复位
if ((((LinearLayoutManager) getLayoutManager()).findFirstCompletelyVisibleItemPosition() == 0
|| ((LinearLayoutManager) getLayoutManager()).findFirstCompletelyVisibleItemPosition() == 1)) {
// 松手的时候 高度大于 一定值 调用刷新
if (mEnablePullRefresh && mHeaderView.getVisibleHeight() >= mHeaderView.getRealityHeight()) {
//变为刷新状态
mPullRefreshing = true;
mHeaderView.setState(RecyclerViewHeader.STATE_REFRESHING);
//回调事件
if (mOnRefreshListener != null) {
mOnRefreshListener.onRefresh();
}
}
resetHeaderHeight();
} else if (isSlideToBottom()) {
// invoke load more.
if (mEnablePullLoad && mFooterView.getBottomMargin() > 0 && !mPullLoading) {
mPullLoading = true;
mFooterView.setState(RecyclerViewFooter.STATE_LOADING);
if (mOnRefreshListener != null) {
mOnRefreshListener.onLoadMore();
}
}
resetFooterHeight();
} else {
// resetFooterHeight();
resetHeaderHeight();
}
break;
}
return super.onTouchEvent(e);
}
参考资料:http://blog.csdn.net/q714093365/article/details/77063084
下载地址:https://download.csdn.net/download/qq_28714343/10562829