Синхронизировать прокрутку двух ScrollViews внутри RelativeLayout

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

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

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

3 ответа

Прикрепить RecyclerView.OnScrollListener как для RecyclerViews с помощью addOnScrollListener(RecyclerView.OnScrollListener listener),

Обновите позицию другого, когда событие происходит через: scrollTo(int x, int y),

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

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

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

Прежде всего, используйте 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(..) Вы звоните может вызвать бесконечные звонки в обоих слушателей NestedScrollViews.

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

Я настоятельно рекомендую ИЗМЕНИТЬ ДИЗАЙН, но есть способ добиться этого

для первого вида прокрутки определите две переменные x,y и получите текущую позицию прокрутки

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

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

лайк:

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

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

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