我需要同步两个ScrollViews
的滚动位置。
两个ScrollViews
都包含他们的个人RecyclerView
(由于设计要求,我无法将它们放在同一个ScrollView中)。
我怎样才能做到这一点?
答案 0 :(得分:0)
我强烈建议您更改设计,但有一种方法可以实现此目的
对于第一个滚动视图,定义两个变量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);
}
});
答案 1 :(得分: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
s的两个侦听器都无限次调用。
当然,您需要为scrollView2
编写类似的上述代码。
答案 2 :(得分:0)
通过RecyclerView.OnScrollListener
将addOnScrollListener(RecyclerView.OnScrollListener listener)
附加到RecyclerViews
。
通过以下方式更新事件发生时另一个人的位置:scrollTo(int x, int y)
。
请记住以某种方式区分用户触发的滚动和programmtic滚动(来自其他RecyclerViews
事件)。
与Ugurcan Yildirim建议一样,有一种方法可以分离您想要更新的ScrollView
的监听器。
另一个选项是布尔标志isUserTriggered
。第三种方法是确定哪个ScrollView目前有焦点要区分(参见here)。