嵌套的Recyclerview自行滚动

时间:2016-08-15 03:43:49

标签: android android-recyclerview

我有一个父回收站视图,里面有3个子视图。孩子的最后两个是recyclerview。

$(document).on('keypress',function(e){
if(e.keyCode === 49){
    $('#form1').submit();
}
})

问题是,每当此片段可见时,它会自动滚动以与Parent recyclerview - child view 1 - child view 2 (horizontal rv) - child view 3 (horizontal rv) 的底部对齐。

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

child view 2

似乎父回收者视图的起始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 设置为dy0 rv。它上面的一切都是-ve值。但是,我不确定是否是这种情况,因为我仍然在找出导致它的原因。

任何修复?

7 个答案:

答案 0 :(得分:126)

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

当我们将支持库从23.4.0升级到24.0.0时,突然出现了自动滚动。特别是,当我们打开Activity然后我们返回时,垂直RecyclerView向上滚动,以便当前水平RecyclerView行不会被切断并且行完全显示。 / p>

有一个简单的解决方法。将其添加到外部/父级 RecyclerView

android:descendantFocusability="blocksDescendants"

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

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

顺便说一下,还有一个open issue on the AOSP

答案 1 :(得分:3)

啊,我一直在努力修复。实际上解决方案非常简单。作为我(以及将来面临同样问题的其他人)的参考,我只需要在子视图的rv setFocusable()false,它就不再关注那个视图了。片段是可见的。

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

答案 2 :(得分:3)

经过长时间的搜索后,我开始关注设置为true的参数reverseLayout。我换了

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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