0

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

两者都ScrollViews包含它们的个体RecyclerView(由于设计要求,我不能将它们放在同一个 ScrollView 中)。

我怎样才能做到这一点?

4

3 回答 3

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);
              }
          });
于 2016-08-08T13:20:26.260 回答
0

通过将一个附加RecyclerView.OnScrollListener到两者。RecyclerViewsaddOnScrollListener(RecyclerView.OnScrollListener listener)

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

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

一种方法是,就像Ugurcan Yildirim建议的那样,分离ScrollView您想要更新的侦听器。

另一种选择是布尔标志isUserTriggered。第三种方法是确定当前哪个 ScrollView 具有要区分的焦点(请参阅此处)。

于 2016-08-08T13:32:39.737 回答
0

首先,使用NestedScrollView支持库,因为它使我们能够轻松地监听滚动事件。然后,为你拥有onScrollChange的两个设置监听器。例如,NestedScrollView当您收到滚动更改时,请调用:scrollView1scrollTo(...)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(..)您的调用可能会导致NestedScrollViews 的两个侦听器中的无限调用。

当然,您需要为您的scrollView2.

于 2016-08-08T13:25:31.380 回答