@Override
  public boolean onTouchEvent(MotionEvent e) {
    if (mRefreshEnable || mLoadMoreEnable) {
      switch (e.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
          mDownMotionEventY = (int) e.getRawY();
          break;

        case MotionEvent.ACTION_MOVE:
          mCurMotionEventY = (int) e.getRawY();

          if (mLoadMoreEnable && mCurMotionEventY - mDownMotionEventY < -20) {
            mIsUpFlag = true;
          }

          if (mLoadMoreEnable && checkCanLoadMore()) {
            Log.e(TAG, "checkLoadMore");
            showLoadMoreView();
          }

          if (mRefreshEnable && checkCanRefresh()) {
            Log.d(TAG, "canRefresh");
            mRefreshHeader.move(
                (mCurMotionEventY - mDownMotionEventY) / 2, mCurMotionEventY, mDownMotionEventY);
          }

          break;

        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
          if (mRefreshHeader != null
              && mRefreshHeader.getRefreshState() != REFRESH_STATE_REFRESHING) {
            mRefreshHeader.upOrCancel(mRefreshDataListener);
          }

          mIsUpFlag = false;
          break;
      }
    }

    return super.onTouchEvent(e);
  }