我需要同步两个的滚动位置ScrollViews
。
两者都ScrollViews
包含它们的个体RecyclerView
(由于设计要求,我不能将它们放在同一个 ScrollView 中)。
我怎样才能做到这一点?
我需要同步两个的滚动位置ScrollViews
。
两者都ScrollViews
包含它们的个体RecyclerView
(由于设计要求,我不能将它们放在同一个 ScrollView 中)。
我怎样才能做到这一点?
我强烈建议您更改您的设计,但有一种方法可以实现这一点
对于第一个滚动视图,定义两个变量 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);
}
});
通过将一个附加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(..)
for之前scrollView2
,移除它的监听器,然后再添加它。否则,scrollTo(..)
您的调用可能会导致NestedScrollView
s 的两个侦听器中的无限调用。
当然,您需要为您的scrollView2
.