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; } }
@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); }