0

Мне нужно синхронизировать позиции прокрутки двух ScrollViews.Синхронизировать прокрутку двух ScrollViews внутри RelativeLayout

Оба ScrollViews содержат их отдельные RecyclerView (я не могу поместить их внутри одного ScrollView из-за требований к дизайну).

Как я могу это достичь?

+0

Имеются ли в RecyclerViews одни и те же данные? –

+0

Почему вы вообще хотите использовать ScrollView? RecyclerView имеет свою собственную логику прокрутки! :) –

+0

нет, они содержат разные данные. @progressive_overload –

ответ

0

Я настоятельно рекомендую вам изменить свой дизайн, но есть способ для достижения этой

для первой точки зрения прокрутки, определить две переменные х, у и получить текущую позицию прокрутки

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

и передать их значения для другого метода scrollTo scrollView.

как:

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

если не работает, попробуйте:

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

Прежде всего, используйте NestedScrollView из библиотеки поддержки, поскольку она позволяет слушать прокручивать события легко. Затем установите onScrollChange слушателей для обоих NestedScrollView у вас есть. При получении прокрутки изменения для scrollView1, например, вызов scrollTo(...) для scrollView2:

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 

     } 
}); 

Перед вызовом scrollTo(..) для scrollView2, удаления своего слушателя, а затем добавить его снова. В противном случае scrollTo(..), который вы вызываете, может вызвать бесконечные вызовы в обоих прослушивателях NestedScrollView.

И, конечно же, вам необходимо написать аналогичный код выше для вашего scrollView2.

+0

нет критики просто честный вопрос: зачем использовать ScrollView вообще, а затем даже NestedScrollView?По умолчанию RecyclerView имеет собственную логику прокрутки (см. Мой ответ). –

+0

Вопрос о синхронизации ScrollViews. Меня не волнует, что он/она хочет вставить в них. –

+0

Я вижу, таким образом ваш ответ был бы более универсальным –

0

Прикрепите RecyclerView.OnScrollListener к обоим RecyclerViews через addOnScrollListener(RecyclerView.OnScrollListener listener).

Обновить положение другого при запуске события: scrollTo(int x, int y).

Не забудьте каким-то образом различать свиток с запросом пользователя и прокрутку прокрутки (от другого события RecyclerViews).

Один из способов был бы, например, Ugurcan Yildirim предложил отсоединить слушателя от ScrollView, который вы хотите обновить.

Другим вариантом является булевский флаг isUserTriggered. Третьим способом было бы определить, какой ScrollView в настоящее время имеет фокус для отличия (см. here).

Смежные вопросы