Example #1
0
  private void changeHeaderByState(int state) {
    switch (state) {
      case DONE:
        headerView.setPadding(0, -headerViewHeight, 0, 0);
        firstSetpView.setVisibility(View.VISIBLE);
        secondAnimation.stop();
        secondStepView.setVisibility(View.GONE);
        break;
      case RELEASE_TO_REFRESH:
        tv_pull_to_refresh.setText("松开刷新");

        break;
      case PULL_TO_REFRESH:
        tv_pull_to_refresh.setText("下拉刷新");
        state = DONE;
        firstSetpView.setVisibility(View.VISIBLE);
        secondAnimation.stop();
        secondStepView.setVisibility(View.GONE);
        break;
      case REFRESHING:
        tv_pull_to_refresh.setText("正在刷新");
        firstSetpView.setVisibility(View.GONE);
        secondStepView.setVisibility(View.VISIBLE);
        secondAnimation.stop();
        secondAnimation.start();
        break;
      default:
        break;
    }
  }
Example #2
0
  @Override
  public boolean onTouchEvent(MotionEvent ev) {
    if (isEnd) {
      if (isRefreable) {
        switch (ev.getAction()) {
          case MotionEvent.ACTION_DOWN:
            if (mFirstVisibleItem == 0 && !isRecord) {
              isRecord = true;
              startY = ev.getY();
            }
            break;
          case MotionEvent.ACTION_MOVE:
            float tempY = ev.getY();
            if (mFirstVisibleItem == 0 && !isRecord) {
              isRecord = true;
              startY = tempY;
            }
            if (state != REFRESHING && isRecord) {
              offsetY = tempY - startY;
              float currentHeight = (-headerViewHeight + offsetY / 3);
              float currentProgress = 1 + currentHeight / headerViewHeight;
              if (currentProgress >= 1) {
                currentProgress = 1;
              }
              if (state == RELEASE_TO_REFRESH && isRecord) {
                setSelection(0);
                // pull to refresh
                if (-headerViewHeight + offsetY / RATIO < 0) {
                  state = PULL_TO_REFRESH;
                  changeHeaderByState(state);
                } else if (offsetY <= 0) {
                  state = DONE;
                  changeHeaderByState(state);
                }
              }
              if (state == PULL_TO_REFRESH && isRecord) {
                setSelection(0);
                if (-headerViewHeight + offsetY / RATIO >= 0) {
                  state = RELEASE_TO_REFRESH;
                  changeHeaderByState(state);
                } else if (offsetY <= 0) {
                  state = DONE;
                  changeHeaderByState(state);
                }
              }
              if (state == DONE && isRecord) {
                if (offsetY >= 0) {
                  state = PULL_TO_REFRESH;
                }
              }
              if (state == PULL_TO_REFRESH) {
                headerView.setPadding(0, (int) (-headerViewHeight + offsetY / RATIO), 0, 0);
                firstSetpView.setCurrentProgress(currentProgress);
                firstSetpView.postInvalidate();
              }
              if (state == RELEASE_TO_REFRESH) {
                headerView.setPadding(0, (int) (-headerViewHeight + offsetY / RATIO), 0, 0);
                firstSetpView.setCurrentProgress(currentProgress);
                firstSetpView.postInvalidate();
              }
            }

            break;
          case MotionEvent.ACTION_UP:
            if (state == PULL_TO_REFRESH) {
              this.smoothScrollBy(
                  (int) (-headerViewHeight + offsetY / RATIO) + headerViewHeight, 500);
              changeHeaderByState(state);
            }
            if (state == RELEASE_TO_REFRESH) {
              this.smoothScrollBy((int) (-headerViewHeight + offsetY / RATIO), 500);
              state = REFRESHING;
              mOnRefreshListener.onRefresh();
              changeHeaderByState(state);
            }
            isRecord = false;
            break;
        }
      }
    }
    return super.onTouchEvent(ev);
  }