@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 updateHeaderHeight(float delta) { mHeader.setVisibleHeight((int) delta + mHeader.getVisibleHeight()); if (mEnablePullRefresh && !mPullRefreshing) { // update the arrow image unrefreshing if (mHeader.getVisibleHeight() > mHeaderHeight) { mHeader.setState(XHeaderView.STATE_READY); } else { mHeader.setState(XHeaderView.STATE_NORMAL); } } // scroll to top each time setSelection(0); }
private void updateHeaderHeight(float delta) { mHeader.setVisibleHeight((int) delta + mHeader.getVisibleHeight()); if (mEnablePullRefresh && !mPullRefreshing) { // update the arrow image unrefreshing if (mHeader.getVisibleHeight() > mHeaderHeight) { mHeader.setState(XHeaderView.STATE_READY); } else { mHeader.setState(XHeaderView.STATE_NORMAL); } } // scroll to top each time post( new Runnable() { @Override public void run() { XScrollView.this.fullScroll(ScrollView.FOCUS_UP); } }); }
/** Auto call back refresh. */ public void autoRefresh() { mHeader.setVisibleHeight(mHeaderHeight); if (mEnablePullRefresh && !mPullRefreshing) { // update the arrow image not refreshing if (mHeader.getVisibleHeight() > mHeaderHeight) { mHeader.setState(XHeaderView.STATE_READY); } else { mHeader.setState(XHeaderView.STATE_NORMAL); } } mPullRefreshing = true; mHeader.setState(XHeaderView.STATE_REFRESHING); refresh(); }
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(); } }
private void resetHeaderHeight() { int height = mHeader.getVisibleHeight(); if (height == 0) return; // refreshing and header isn't shown fully. do nothing. if (mPullRefreshing && height <= mHeaderHeight) return; // default: scroll back to dismiss header. int finalHeight = 0; // is refreshing, just scroll back to show all the header. if (mPullRefreshing && height > mHeaderHeight) { finalHeight = mHeaderHeight; } mScrollBack = SCROLL_BACK_HEADER; mScroller.startScroll(0, height, 0, finalHeight - height, SCROLL_DURATION); // trigger computeScroll invalidate(); }
@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); }
private boolean isTop() { return getScrollY() <= 0 || mHeader.getVisibleHeight() > mHeaderHeight || mContentLayout.getTop() > 0; }