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