【问题标题】:Nested Recyclerview scrolls by itself嵌套的 Recyclerview 自行滚动
【发布时间】:2016-08-15 03:43:49
【问题描述】:

我有一个父 recyclerview,其中有 3 个子视图。最后两个child是recyclerview。

Parent recyclerview
 - child view 1
 - child view 2 (horizontal rv)
 - child view 3 (horizontal rv)

问题是每次可见此片段时,它都会自行滚动以与child view 2 的底部对齐。

我已将父 rv 设置为监听滚动。这就是我最终的结果:

dy: 108
dy: 72
dy: 75
dy: 62
dy: 48
dy: 42
dy: 34
dy: 27
dy: 22
dy: 16
dy: 12
dy: 10
dy: 7
dy: 5
dy: 3
dy: 3
dy: 1
dy: 1
dy: 1

似乎父 recyclerview 的起始 dy 设置为 0child view 2 rv。它上面的所有东西都是 -ve 值。但是,我不确定是否是这种情况,因为我仍在找出导致它的原因。

有什么办法吗?

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    我们也有类似的问题。我们有一个垂直的RecyclerView。这个垂直的RecyclerView 的每个项目都包含一个水平的RecyclerView,就像在 Android TV 应用中一样。

    当我们将支持库从 23.4.0 升级到 24.0.0 时,自动滚动突然出现。特别是,当我们打开一个Activity 然后返回时,垂直的RecyclerView 向上滚动,这样当前水平的RecyclerView 行就不会被剪切,而是完全显示该行。

    有一个简单的解决方法。将此添加到您的外部/父母 RecyclerView:

    android:descendantFocusability="blocksDescendants"
    

    我在这个问题中找到了解决方案:

    另外,我找到了another solution,它也有效。在我们的例子中,垂直的RecyclerView 包含在FrameLayout 中。如果我将android:focusableInTouchMode="true" 添加到此FrameLayout,问题就会消失。

    对了,还有一个open issue on the AOSP

    【讨论】:

    • 为了清楚起见,您应该将此添加到自动滚动的RecyclerView 的父级中。
    • 奇怪的是它只发生在发布版本中,调试版本很好
    • 对我来说,将android:focusableInTouchMode="true" 添加到NestedScrollViewRecyclerView 的父级解决了这个问题。添加这段代码后有什么副作用吗?
    • 如果您的 recyclerView 中有 EditText,它将无法正常工作。它会让你的 EditText 在 onClick 时闪烁
    【解决方案2】:

    啊,我一直在努力解决问题。解决方案实际上非常简单。作为我的参考(以及将来面临相同问题的其他人),我只需要将子视图的 rv 中的setFocusable() 转至false,并且当片段可见时它不再关注该视图.

    就我而言,我必须在从 API 加载数据后以编程方式设置它。

    【讨论】:

    • 这已经解决了。谢谢。您只需要确保根 recyclerview 实例是否应该标记为可聚焦为 false 的实例。
    【解决方案3】:

    试试这个android:descendantFocusability="blocksDescendants"。它为我解决了这个问题。

    【讨论】:

      【解决方案4】:

      经过长时间的搜索,我看到了设置为 true 的参数 reverseLayout。我换了

      horizontalRV.setLayoutManager(
          new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, true));
      

      horizontalRV.setLayoutManager(
          new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
      

      【讨论】:

        【解决方案5】:

        对@albertvilacalvo 的简短提示回答: 如果您以编程方式使用 RecyclerView,您可以通过这种方式处理 setFocusableInTouchMode(包括在您的 RecyclerView 类中)

        @Override
        protected void onAttachedToWindow() {
           ((View) getParent()).setFocusableInTouchMode(true);
           super.onAttachedToWindow();
        }
        

        如果您的子视图中需要 EditText,descendantFocusability 解决方案将失败,它们将不再获得光标。我在我的 RecyclerView 孩子中使用 ListView、自定义(多)触摸和 EditText。到目前为止,使用 setFocusableInTouchMode 没有任何副作用。

        【讨论】:

          【解决方案6】:

          仅在 oncreate 中初始化布局管理器或仅 1 次不要重新初始化它 recyclerview.setLayoutManager(new LinearLayoutManager(context));

          【讨论】:

            【解决方案7】:

            如果您嵌套了RecyclerViews,请尝试摆脱ConstraintLayout。 我刚刚用旧的LinearLayout 替换了ConstraintLayout,不需要的滚动消失了!

            希望这可能对某人有所帮助:)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-10-24
              • 2018-09-14
              • 1970-01-01
              • 2016-07-17
              • 2015-12-08
              • 2021-06-10
              • 1970-01-01
              相关资源
              最近更新 更多