同步在RelativeLayout中滚动两个ScrollViews

时间:2016-08-08 13:08:56

标签: android android-recyclerview scrollview android-scrollview synchronized-scrolling

我需要同步两个ScrollViews的滚动位置。

两个ScrollViews都包含他们的个人RecyclerView(由于设计要求,我无法将它们放在同一个ScrollView中)。

我怎样才能做到这一点?

3 个答案:

答案 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.OnScrollListeneraddOnScrollListener(RecyclerView.OnScrollListener listener)附加到RecyclerViews

通过以下方式更新事件发生时另一个人的位置:scrollTo(int x, int y)

请记住以某种方式区分用户触发的滚动和programmtic滚动(来自其他RecyclerViews事件)。

Ugurcan Yildirim建议一样,有一种方法可以分离您想要更新的ScrollView的监听器。

另一个选项是布尔标志isUserTriggered。第三种方法是确定哪个ScrollView目前有焦点要区分(参见here)。