android 下拉刷新+上拉加载的RecyclerView

最近需要用到下拉上拉功能,又不用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

猜你喜欢

转载自blog.csdn.net/qq_28714343/article/details/81199698