0

두 개의 스크롤 위치를 동기화해야합니다. ScrollViews.RelativeLayout 내에서 두 ScrollViews의 스크롤 동기화

ScrollViews에는 각각 RecyclerView이 포함되어 있습니다 (디자인 요구 사항으로 인해 동일한 ScrollView에 넣을 수 없습니다).

어떻게하면됩니까?

+0

RecyclerViews에 동일한 데이터가 포함되어 있습니까? –

+0

왜 ScrollView를 사용하고 싶습니까? RecyclerView에는 자체 스크롤 논리가 있습니다! :) –

+0

그들은 서로 다른 데이터를 포함하고 있지 않습니다. @progressive_overload –

답변

0

은 내가보기 엔 당신이 당신의 디자인을하지만 첫번째 스크롤 뷰에 대해이

을 달성하는 방법이, Y 두 변수 x를 정의하고 현재 스크롤 위치

x = firstScrollView.getScrollX(); 
y = firstScrollView.getScrollY(); 

를 얻을이 통과하는 것이 좋습니다 값을 다른 scrollView "scrollTo"메서드에 전달합니다.

같은 : 쉽게 이벤트를 스크롤 듣고 우리를 수 있기 때문에 모든

secondScrollView.post(new Runnable() { 
     @Override 
     public void run() { 
     secondScrollView.scrollTo(x, y); 
       } 
      }); 
0

첫째, 지원 라이브러리에서 NestedScrollView를 사용

ScrollView secondScrollView = (ScrollView)findViewById(R.id.scrollView); 
secondScrollView.scrollTo(x, y); 

시도가 작동하지 않은 경우. 그런 다음 NestedScrollView에 대해 onScrollChange 수신기를 설정합니다. 다음 다시 추가,

scrollView1.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { 
     @Override 
     public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 

      scrollView2.setOnScrollChangeListener(null); 
      scrollView2.scrollTo(scrollX, scrollY); 
      scrollView2.setOnScrollChangeListener(...); //SET SCROLL LISTENER AGAIN 

     } 
}); 

scrollView2에 대한 scrollTo(..)를 호출하기 전에 그 리스너를 제거 : 당신은 예를 들어 scrollView1에 대한 스크롤 변화를받을 때, scrollView2에 대한 scrollTo(...)를 호출합니다. 그렇지 않은 경우 scrollTo(..)을 호출하면 두 청취자 모두에서 무한 통화가 발생하여 NestedScrollView 초가 걸릴 수 있습니다.

그리고 물론 위의 코드를 scrollView2과 비슷하게 작성해야합니다.

+0

비판은 정직한 질문입니다 : 왜 ScrollView를 사용하고 나서 NestedScrollView를 사용합니까?RecyclerView에는 기본적으로 자체 스크롤 논리가 있습니다 (내 대답 참조). –

+0

질문은 ScrollViews 동기화에 관한 것입니다. 나는 그 (것)들 안쪽에두기 위하여 그가 원하는 무엇을 걱정하지 않는다. –

+0

당신의 답은 더욱 보편적 일 것입니다. –

0

addOnScrollListener(RecyclerView.OnScrollListener listener)을 통해 RecyclerView.OnScrollListener을 첨부하십시오.

이벤트가 발생할 때 다른 위치의 업데이트 위치는 scrollTo(int x, int y)입니다.

어떻게 든 사용자 트리거 스크롤과 다른 스크롤 스크린 (다른 RecyclerViews 이벤트)을 구분해야합니다.

Ugurcan Yildirim과 같은 한 가지 방법으로 업데이트하려는 수신기의 수신자를 분리 할 수 ​​있습니다.

또 다른 옵션은 부울 플래그 isUserTriggered입니다. 세 번째 방법은 현재 어떤 ScrollView를 구별 할 것인지 결정하는 것입니다 (here 참조).

관련 문제