2013-10-09 6 views
4

이 질문에 매우 구체적이고 내가 (목록보기로) 할 노력하고 있어요 다음 문서에 자세히 설명되어 링크에 대한 trivedi @kaushal http://www.pushing-pixels.org/2011/07/18/android-tips-and-tricks-synchronized-scrolling.html동기 스크롤

감사합니다

세부 사항 : 나는 사용자 정의 어댑터와 함께 목록보기를 사용하는 작업중인 안드로이드 응용 프로그램을 가지고 있습니다. Listview 고정되지 않은 높이의 사용자 정의 머리글이 들어 있습니다. 또한 목록 항목의 높이가 가변적이라는 점에 유의하십시오. 내 목표는 최신 Gmail Gmail 앱에서 생성 된 효과를 모방하는 것입니다 (예를 들어 이메일을 볼 때 헤더를지나 스크롤하면 작업 표시 줄 바로 아래의 화면 상단에 붙어 있습니다. 내용은 계속됩니다). 그것 아래로 스크롤하십시오. 내가하고 싶은 것은 내 머리글의 아래쪽 절반을 화면 상단에 붙입니다.

내 초기 추론은 원하는 위치에 고정 된 보이지 않는보기를 만드는 것이었고 사용자가 그 위치로 스크롤하거나 지나쳤을 때보기를 볼 수있게 만들었습니다. 이 논리의 문제는 정확한 픽셀 스크롤 높이가 필요하다는 것인데, 많은 시도 후에이를하기가 매우 어렵다고 판단했습니다. 내가 만난 정확한 문제는 onScroll 이벤트에서 픽셀 수준 Y 스크롤을 검색하기 위해 수집 할 수없는 것이기 때문에 onScrollStateChanged 이벤트에서 값을 검색 할 수만있었습니다. 위에서 설명한대로 원하는 기능을 수행하지 못합니다.

"int firstVisibleItem, int visibleItemCount, int totalItemCount"매개 변수도 onScroll 이벤트와 함께 작업합니다. 왜냐하면 "stick"하려는 내용이 목록 항목의 크기가 아니라 분수 가변 높이 헤더의 크기.

이 효과를 얻으려면 올바른 방법이 있습니까? 나의 현재 minSDK 수준은 좀 진전을 업데이트 10/10/13

(10)

입니다. 다음 코드는 화면에있는 Y 위치 부동 뷰를 목록보기와 동기화합니다. b는 제가 예제로 설정 한 뷰입니다.

참고 :이 목록보기의 onScroll 이벤트가 사용됩니다.

View c = view.getChildAt(0); 
if (c != null) { 
    int currY = c.getTop(); 
    int diffY = currY - lastY; 

    lastY = currY; 
    b.setTop(b.getTop() + diffY); 
} 

이제 내 목록의 머리글은 이전에 말했듯이 고정 된 높이가 아닙니다. 그래서 나는 머리글의 높이를 얻고 "b"에 오프셋을 적용하여 목록 위에 떠있는 목록 머리글의 맨 아래에 놓아야합니다.

이것은 지금까지 시도한 코드입니다.

header.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

문제는 여기에서 우리는 항상 상관없이 실제 높이가 얼마나 키가 같은 값으로 해결하지 header.getMeasuredHeight();.

신장이 표시 될 때까지 높이를 알 수없는 것으로 알고 있습니다. 그 값을 얻고 렌더 된 후에 오프셋을 설정할 수있는 방법이 있습니까? 10/11/13

업데이트 나는 즉시 내가 오늘 아침에 일어 났는데 나의 마지막 질문을 답변.

View.measure() 코드가 높이를 반환하는 동안.텍스트가 없다고 가정하면보기의 기본 높이 인 것처럼 보입니다 (궁극적으로보기가 확장 됨). 그래서 나는 곧 출근해야

ViewTreeObserver vto = header.getViewTreeObserver();  
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {   
    @Override   
    public void onGlobalLayout() {    
     b.setY(header.getMeasuredHeight() - 80); //80 is a temp offset 
    }  
}); 

을보기가 표시 될 때 수신 한 다음 (나는 :) 기대했던대로 정확하게 작동하는)의 실제 높이를 기록하기 위해 아래의 이벤트를 사용하고 내가되고 아직 원하는 효과를 완전히 얻지 못했지만 아직 답변하지 않았습니다. 다행히도 나는 앉아서 다음날이나 이틀에 끝낼 수있을 것이다. 나는 이것을하기위한 더 좋은 방법에 대한 제안에 여전히 열려있다.

+0

당신은 목록보기에서이 헤더보기를 제거하고 경우 둘러싸는 LinearLayout에 그것을 추가하면 (자), 모든 구현은 꽤 간단하게됩니다. –

+0

헤더는 여전히 목록보기로 한 지점까지 스크롤해야합니다. 그것은 당신의 제안에도 여전히 가능합니까? – gh123man

+1

이 링크를 클릭하면 you.https : //plus.google.com/u/0/+RomanNurik/posts/1Sb549FvpJt –

답변

2

오케이, 많은 시간과 연구를 거친 후, 제 질문에 대한 답변을 찾았습니다.

첫째을, 당신은이 링크 @kaushal 감사합니다 http://www.pushing-pixels.org/2011/07/18/android-tips-and-tricks-synchronized-scrolling.html

내 솔루션은 다소 복잡 었죠. 그래서 그 대신 여기를 설명하기 위해 노력하고, 나는 예제 응용 프로그램을 만들어 여기에 게시 : https://github.com/gh123man/Partial-Header-ListView-Scroll-Sync

솔루션에 대한 코드를 포함하는 특정 파일이 여기에 있습니다 : https://github.com/gh123man/Partial-Header-ListView-Scroll-Sync/blob/master/src/com/example/partialheaderlistviewscrollsync/MainActivity.java