【问题标题】:Synchronize scrolling of two ScrollViews inside a RelativeLayout在 RelativeLayout 中同步两个 ScrollView 的滚动
【发布时间】:2016-08-08 13:08:56
【问题描述】:

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

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

我怎样才能做到这一点?

【问题讨论】:

  • RecyclerViews 是否包含相同的数据?
  • 为什么要使用 ScrollView? RecyclerView 有自己的滚动逻辑! :)
  • 不,它们包含不同的数据.. @progressive_overload
  • 所以如果一个滚动到最后,另一个可能仍然有空间到底部,因为它包含更多数据?您想要滚动的绝对映射还是相对映射?
  • 用于以最简单的形式同步 ScrollView,check here

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


【解决方案1】:

我强烈建议您更改您的设计,但有一种方法可以实现这一点

对于第一个滚动视图,定义两个变量 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);
              }
          });

【讨论】:

    【解决方案2】:

    首先,使用支持库中的NestedScrollView,因为它使我们能够轻松地监听滚动事件。然后,为您拥有的两个NestedScrollView 设置onScrollChange 侦听器。例如,当您收到scrollView1 的滚动更改时,请为scrollView2 调用scrollTo(...)

    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
    
            }
    });
    

    在为scrollView2 调用scrollTo(..) 之前,删除其侦听器,然后再次添加它。否则,您调用的scrollTo(..) 可能会导致NestedScrollViews 的两个侦听器中的无限调用。

    当然,您需要为您的scrollView2 编写类似的上述代码。

    【讨论】:

    • 没有批评只是一个诚实的问题:为什么要使用 ScrollView,然后甚至使用 NestedScrollView? RecyclerView 默认有自己的滚动逻辑(见我的回答)。
    • 问题是关于同步滚动视图。我不在乎他/她想在里面放什么。
    • 我明白了,这样你的答案会更普遍
    • 我知道RecyclerView默认有自己的滚动逻辑。但是我正在制作的应用程序需要这样的操作。实际上设计非常复杂......我问这个问题是为了解决我面临的特定设计问题。 @progressive_overload
    【解决方案3】:

    通过addOnScrollListener(RecyclerView.OnScrollListener listener)RecyclerView.OnScrollListener 附加到RecyclerViews

    通过scrollTo(int x, int y) 触发事件时更新另一个位置。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多