2013-07-17 2 views
1

ListView의 맨 위에 고정되도록 헤더의 일부를 관리하는 ListView.addHeaderView (...)에 뷰를 추가하는 컨트롤러를 만들었습니다. 내가 어떻게하는지 헤더의 부분이 ListView의 맨 위에있을 때 머리글에서 피너 블 뷰를 제거하고 ListView의 부모 뷰 맨 위에 추가 할 때 컨트롤이 OnScrollListener를 모니터링하도록해야합니다.안드로이드는 ListView의 ScrollBar의 최상위 위치를 조정합니다.

이 작업은 ListView의 오른쪽에있는 스크롤 막대에 대한 면제가 ListView의 맨 위에 고정 된보기 뒤에 있음을 예상합니다. 막대를 고정 된 뷰의 높이 아래로 옵셋해야합니다.

ScrollBar의 위쪽 부분을 조정하는 방법이 있습니까?

모든 도움에 감사드립니다. 감사! 그것은 ListView.computeVerticalScrollOffset의 사본의 두 가지의 수정 :

답변

1

이 확인을 작동하는 것 같다 ListView

  • 교체

    • 서브 클래스 ListView,
    • 복사 ListView.computeVerticalScrollOffset 사용자 정의에 서브 클래스를 사용하도록 레이아웃을 수정 getter를 사용한 멤버 변수 참조 (아래 참조)
    • 사용하려는 조정을 고려하여 오프셋 방법을 수정하십시오 (아래 참조)

    YourListView.java :

    @Override 
    protected int computeVerticalScrollOffset() { 
        final int firstPosition = getFirstVisiblePosition(); 
        final int childCount = getChildCount(); 
        if (firstPosition >= 0 && childCount > 0) { 
         if (isSmoothScrollbarEnabled()) { 
          final View view = getChildAt(0); 
          final int top = view.getTop(); 
    
          int height = view.getHeight(); 
          if (height > 0) { 
    
           // The core of the change is here (mHeaderRowHeight) 
           return Math.max(firstPosition * 100 - (top * 100)/height + 
             (int) ((float) (getScrollY() + mHeaderRowHeight)/(getHeight() + mHeaderRowHeight) * getCount() * 100), 0); 
          } 
         } else { 
          int index; 
          final int count = getCount(); 
          if (firstPosition == 0) { 
           index = 0; 
          } else if (firstPosition + childCount == count) { 
           index = count; 
          } else { 
           index = firstPosition + childCount/2; 
          } 
          return (int) (firstPosition + childCount * (index/(float) count)); 
         } 
        } 
        return 0; 
    } 
    
  • 관련 문제