@Override public void onScroll( AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { firstItemIndex = firstVisibleItem; if (firstItemIndex == 0) { if (positionListener != null) { positionListener.hideBackTopButton(); } } else { if (positionListener != null) { positionListener.showBackTopButton(); } } }
@Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: if (firstItemIndex == 0 && !isRecored) { isRecored = true; startY = (int) ev.getY(); LogUtils.i(TAG, "手指按下去的位置"); } if (positionListener != null) { positionListener.backTopButtonFocuse(); } break; case MotionEvent.ACTION_MOVE: int tempY = (int) ev.getY(); if (firstItemIndex == 0 && !isRecored) { LogUtils.i(TAG, "在手指移动的记录下位置"); isRecored = true; startY = tempY; } if (state != REFRESHING && isRecored && state != LOADING) { // 保证在设置padding的过程中,当前的位置一直是在head,否则如果当列表超出屏幕的话,当在上推的时候,列表会同时进行滚动 // 可以松手去刷新了 if (state == RELEASE_TO_REFRESH) { setSelection(0); // 往上推了,推到了屏幕足够掩盖head的程度,但是还没有推到全部掩盖的地步 if (((tempY - startY) / RATIO < headerHeight) && (tempY - startY) > 0) { state = PULL_TO_REFRESH; changeHeaderViewByState(); LogUtils.i(TAG, "由松开刷新状态转变到下拉刷新状态"); } else if (tempY - startY <= 0) { // 一下子推到顶了 state = DONE; changeHeaderViewByState(); LogUtils.i(TAG, "由松开刷新状态转变到done状态"); } // 往下拉了,或者还没有上推到屏幕顶部掩盖head的地步 else { // 不用进行特别的操作,只用更新paddingTop的值就行了 } } // 还没有到达显示松开刷新的时候,DONE或者是PULL_TO_REFRESH状态 if (state == PULL_TO_REFRESH) { setSelection(0); // 下拉到可以进入RELEASE_TO_REFRESH的状态 if ((tempY - startY) / RATIO >= headerHeight) { state = RELEASE_TO_REFRESH; isBack = true; changeHeaderViewByState(); LogUtils.i(TAG, "由done或者下拉刷新状态转变到松开刷新"); } // 上推到顶了 else if (tempY - startY <= 0) { state = DONE; changeHeaderViewByState(); // /Log.v(TAG, "由DOne或者下拉刷新状态转变到done状态"); } } // done状态下 if (state == DONE) { if (tempY - startY > 0) { state = PULL_TO_REFRESH; changeHeaderViewByState(); } } // 更新headView的size if (state == PULL_TO_REFRESH) { header.setPadding(0, -1 * headerHeight + (tempY - startY) / RATIO, 0, 0); } // 更新headView 的paddingTop if (state == RELEASE_TO_REFRESH) { header.setPadding(0, (tempY - startY) / RATIO - headerHeight, 0, 0); } } break; case MotionEvent.ACTION_UP: if (state != REFRESHING && state != LOADING) { if (state == DONE) {} if (state == PULL_TO_REFRESH) { state = DONE; changeHeaderViewByState(); LogUtils.i(TAG, "由下拉刷新状态,到done状态"); } if (state == RELEASE_TO_REFRESH) { state = REFRESHING; changeHeaderViewByState(); onRefresh(); LogUtils.i(TAG, "由松开刷新状态,到done状态"); } } isRecored = false; isBack = false; if (positionListener != null) { positionListener.backTopButtonBlur(); } break; default: break; } return super.onTouchEvent(ev); }