コード例 #1
0
  public void setHeader(View header) {
    mPlaceholderView.setVisibility(View.VISIBLE);
    mListView
        .getViewTreeObserver()
        .addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
              @Override
              public void onGlobalLayout() {

                mQuickReturnHeight = mQuickReturnView.getHeight();
                mListView.computeScrollY();
                mCachedVerticalScrollRange = mListView.getListHeight();
              }
            });

    mListView.setOnScrollListener(
        new OnScrollListener() {
          @SuppressLint("NewApi")
          @Override
          public void onScroll(
              AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            mScrollY = 0;
            int translationY = 0;

            if (mListView.scrollYIsComputed()) {
              mScrollY = mListView.getComputedScrollY();
            }

            int rawY =
                mPlaceholderView.getTop()
                    - Math.min(mCachedVerticalScrollRange - mListView.getHeight(), mScrollY);

            switch (mState) {
              case STATE_OFFSCREEN:
                if (rawY <= mMinRawY) {
                  mMinRawY = rawY;
                } else {
                  mState = STATE_RETURNING;
                }
                translationY = rawY;
                break;

              case STATE_ONSCREEN:
                if (rawY < -mQuickReturnHeight) {
                  mState = STATE_OFFSCREEN;
                  mMinRawY = rawY;
                }
                translationY = rawY;
                break;

              case STATE_RETURNING:
                translationY = (rawY - mMinRawY) - mQuickReturnHeight;
                if (translationY > 0) {
                  translationY = 0;
                  mMinRawY = rawY - mQuickReturnHeight;
                }

                if (rawY > 0) {
                  mState = STATE_ONSCREEN;
                  translationY = rawY;
                }

                if (translationY < -mQuickReturnHeight) {
                  mState = STATE_OFFSCREEN;
                  mMinRawY = rawY;
                }
                break;
            }

            /** this can be used if the build is below honeycomb * */
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB) {
              TranslateAnimation anim = new TranslateAnimation(0, 0, translationY, translationY);
              anim.setFillAfter(true);
              anim.setDuration(0);
              mQuickReturnView.startAnimation(anim);
            } else {
              mQuickReturnView.setTranslationY(translationY);
            }
          }

          @Override
          public void onScrollStateChanged(AbsListView view, int scrollState) {}
        });

    if (header != null) {
      try {
        mQuickReturnView.removeAllViews();
      } catch (Exception e) {
        e.printStackTrace();
      }
      mQuickReturnView.addView(header);
    }
  }
コード例 #2
0
  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    mQuickReturnView.setText("Default");
    mListView.addHeaderView(mHeader);

    // adapter o day
    String[] array =
        new String[] {
          "Android", "Android", "Android", "Android", "Android", "Android", "Android", "Android",
          "Android", "Android", "Android", "Android", "Android", "Android", "Android", "Android"
        };
    mListView.setAdapter(
        new ArrayAdapter<String>(getActivity(), R.layout.list_item, R.id.text1, array));

    mListView
        .getViewTreeObserver()
        .addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
              @Override
              public void onGlobalLayout() {
                mQuickReturnHeight = mQuickReturnView.getHeight();
                mListView.computeScrollY();
                mCachedVerticalScrollRange = mListView.getListHeight();
              }
            });

    mListView.setOnScrollListener(
        new OnScrollListener() {
          @SuppressLint("NewApi")
          @Override
          public void onScroll(
              AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            mScrollY = 0;
            int translationY = 0;

            if (mListView.scrollYIsComputed()) {
              mScrollY = mListView.getComputedScrollY();
            }
            Log.e("------", mPlaceHolder.getTop() + "");
            int rawY =
                mPlaceHolder.getTop()
                    - Math.min(mCachedVerticalScrollRange - mListView.getHeight(), mScrollY);

            switch (mState) {
              case STATE_OFFSCREEN:
                if (rawY <= mMinRawY) {
                  mMinRawY = rawY;
                } else {
                  mState = STATE_RETURNING;
                }
                translationY = rawY;
                break;

              case STATE_ONSCREEN:
                if (rawY < -mQuickReturnHeight) {
                  mState = STATE_OFFSCREEN;
                  mMinRawY = rawY;
                }
                translationY = rawY;
                break;

              case STATE_RETURNING:
                translationY = (rawY - mMinRawY) - mQuickReturnHeight;
                if (translationY > 0) {
                  translationY = 0;
                  mMinRawY = rawY - mQuickReturnHeight;
                }

                if (rawY > 0) {
                  mState = STATE_ONSCREEN;
                  translationY = rawY;
                }

                if (translationY < -mQuickReturnHeight) {
                  mState = STATE_OFFSCREEN;
                  mMinRawY = rawY;
                }
                break;
            }

            /** this can be used if the build is below honeycomb * */
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB) {
              anim = new TranslateAnimation(0, 0, translationY, translationY);
              anim.setFillAfter(true);
              anim.setDuration(0);
              mQuickReturnView.startAnimation(anim);
            } else {
              mQuickReturnView.setTranslationY(translationY);
            }
          }

          @Override
          public void onScrollStateChanged(AbsListView view, int scrollState) {}
        });
  }