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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值