ght = mHeaderViewHeight;
? }
? mScrollBack = SCROLLBACK_HEADER;
? mScroller.startScroll(0, height, 0, finalHeight - height,
? ? SCROLL_DURATION);
? // trigger computeScroll
? 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(XListViewFooter.STATE_READY);
? ?} else {
? ? mFooterView.setState(XListViewFooter.STATE_NORMAL);
? ?}
? }
? mFooterView.setBottomMargin(height);
//? setSelection(mTotalItemCount - 1); // scroll to bottom
?}
?private void resetFooterHeight() {
? int bottomMargin = mFooterView.getBottomMargin();
? if (bottomMargin > 0) {
? ?mScrollBack = SCROLLBACK_FOOTER;
? ?mScroller.startScroll(0, bottomMargin, 0, -bottomMargin,
? ? ?SCROLL_DURATION);
? ?invalidate();
? }
?}
?private void startLoadMore() {
? mPullLoading = true;
? mFooterView.setState(XListViewFooter.STATE_LOADING);
? if (mListViewListener != null) {
? ?mListViewListener.onLoadMore();
? }
?}
?@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
? ? ?&& (mHeaderView.getVisiableHeight() > 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:
? ?mLastY = -1; // reset
? ?if (getFirstVisiblePosition() == 0) {
? ? // invoke refresh
? ? if (mEnablePullRefresh
? ? ? && mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
? ? ?mPullRefreshing = true;
? ? ?mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
? ? ?if (mListViewListener != null) {
? ? ? mListViewListener.onRefresh();
? ? ?}
? ? }
? ? resetHeaderHeight();
? ?} else if (getLastVisiblePosition() == mTotalItemCount - 1) {
? ? // invoke load more.
? ? if (mEnablePullLoad
? ? ? ? && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA
? ? ? ? && !mPullLoading) {
? ? ?startLoadMore();
? ? }
? ? resetFooterHeight();
? ?}
? ?break;
? }
? return super.onTouchEvent(ev);
?}
?@Override
?public void computeScroll() {
? if (mScroller.computeScrollOffset()) {
? ?if (mScrollBack == SCROLLBACK_HEADER) {
? ? mHeaderView.setVisiableHeight(mScroller.getCurrY());
? ?} else {
? ? mFooterView.setBottomMargin(mScroller.getCurrY());
? ?}
? ?postInvalidate();
? ?invokeOnScrolling();
? }
? super.computeScroll();
?}
?@Override
?public void setOnScrollListener(OnScrollListener l) {
? mScrollListener = l;
?}
?@Override
?public void onScrollStateChanged(AbsListView view, int scrollState) {
? if (mScrollListener != null) {
? ?mScrollListener.onScrollStateChanged(view, scrollState);
? }
?}
?@Override
?public void onScroll(AbsListView view, int firstVisibleItem,
? ?int visibleItemCount, int totalItemCount) {
? // send to user's listener
? mTotalItemCount = totalItemCount;
? if (mScrollListener != null) {
? ?mScrollListener.onScroll(view, firstVisibleItem