@Override
  public boolean onTouchEvent(MotionEvent ev) {
    if (mLastY == -1) {
      mLastY = ev.getRawY();
    }

    switch (ev.getAction()) {
      case MotionEvent.ACTION_DOWN:
        mLastY = ev.getRawY();
        break;

      case MotionEvent.ACTION_MOVE:
        final float deltaY = ev.getRawY() - mLastY;
        mLastY = ev.getRawY();

        if (getFirstVisiblePosition() == 0 && (mHeader.getVisibleHeight() > 0 || deltaY > 0)) {
          // the first item is showing, header has shown or pull down.
          updateHeaderHeight(deltaY / OFFSET_RADIO);
          invokeOnScrolling();

        } else if (getLastVisiblePosition() == mTotalItemCount - 1
            && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {
          // last item, already pulled up or want to pull up.
          updateFooterHeight(-deltaY / OFFSET_RADIO);
        }
        break;

      default:
        // reset
        mLastY = -1;
        if (getFirstVisiblePosition() == 0) {
          // invoke refresh
          if (mEnablePullRefresh && mHeader.getVisibleHeight() > mHeaderHeight) {
            mPullRefreshing = true;
            mHeader.setState(XHeaderView.STATE_REFRESHING);
            refresh();
          }

          resetHeaderHeight();

        } else if (getLastVisiblePosition() == mTotalItemCount - 1) {
          // invoke load more.
          if (mEnablePullLoad && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA) {
            startLoadMore();
          }
          resetFooterHeight();
        }
        break;
    }
    return super.onTouchEvent(ev);
  }
  private void resetFooterHeight() {
    int bottomMargin = mFooterView.getBottomMargin();

    if (bottomMargin > 0) {
      mScrollBack = SCROLL_BACK_FOOTER;
      mScroller.startScroll(0, bottomMargin, 0, -bottomMargin, SCROLL_DURATION);
      invalidate();
    }
  }
  private void updateFooterHeight(float delta) {
    int height = mFooterView.getBottomMargin() + (int) delta;

    if (mEnablePullLoad && !mPullLoading) {
      if (height > PULL_LOAD_MORE_DELTA) {
        // height enough to invoke load more.
        mFooterView.setState(XFooterView.STATE_READY);
      } else {
        mFooterView.setState(XFooterView.STATE_NORMAL);
      }
    }

    mFooterView.setBottomMargin(height);

    // scroll to bottom
    // setSelection(mTotalItemCount - 1);
  }
예제 #4
0
  private void resetHeaderOrBottom() {
    if (isTop()) {
      // invoke refresh
      if (mEnablePullRefresh && mHeader.getVisibleHeight() > mHeaderHeight) {
        mPullRefreshing = true;
        mHeader.setState(XHeaderView.STATE_REFRESHING);
        refresh();
      }
      resetHeaderHeight();

    } else if (isBottom()) {
      // invoke load more.
      if (mEnablePullLoad && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA) {
        startLoadMore();
      }
      resetFooterHeight();
    }
  }
예제 #5
0
  private void updateFooterHeight(float delta) {
    int height = mFooterView.getBottomMargin() + (int) delta;

    if (mEnablePullLoad && !mPullLoading) {
      if (height > PULL_LOAD_MORE_DELTA) {
        // height enough to invoke load  more.
        mFooterView.setState(XFooterView.STATE_READY);
      } else {
        mFooterView.setState(XFooterView.STATE_NORMAL);
      }
    }

    mFooterView.setBottomMargin(height);

    // scroll to bottom
    post(
        new Runnable() {
          @Override
          public void run() {
            XScrollView.this.fullScroll(ScrollView.FOCUS_DOWN);
          }
        });
  }
예제 #6
0
  @Override
  public boolean onTouchEvent(MotionEvent ev) {
    if (mLastY == -1) {
      mLastY = ev.getRawY();
    }

    switch (ev.getAction()) {
      case MotionEvent.ACTION_DOWN:
        mLastY = ev.getRawY();
        break;

      case MotionEvent.ACTION_MOVE:
        final float deltaY = ev.getRawY() - mLastY;
        mLastY = ev.getRawY();

        if (isTop() && (mHeader.getVisibleHeight() > 0 || deltaY > 0)) {
          // the first item is showing, header has shown or pull down.
          updateHeaderHeight(deltaY / OFFSET_RADIO);
          invokeOnScrolling();

        } else if (isBottom() && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {
          // last item, already pulled up or want to pull up.
          updateFooterHeight(-deltaY / OFFSET_RADIO);
        }
        break;

      default:
        // reset
        mLastY = -1;

        resetHeaderOrBottom();
        break;
    }

    return super.onTouchEvent(ev);
  }
예제 #7
0
 private boolean isBottom() {
   return Math.abs(getScrollY() + getHeight() - computeVerticalScrollRange()) <= 5
       || (getScrollY() > 0 && null != mFooterView && mFooterView.getBottomMargin() > 0);
 }