Пример #1
0
 @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();
     }
   }
 }
Пример #2
0
  @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);
  }