2016-08-15 88 views
11

我有一个家长recyclerview有3个子视图。儿童的最后两名是recyclerview。嵌套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值。但是,我不确定是否属于这种情况,因为我仍然找出导致它的原因。

是否有修复?

回答

64

我们有类似的问题。我们有一个垂直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

+0

工作在几秒钟内.. –

+1

要清楚,您应该将其添加到自动滚动的“RecyclerView”的父级。 – Pei

+0

我永远不会想到这一点。 –

2

啊,我一直在努力修复。实际上解决方案非常简单。作为我(以及将来面临同样问题的任何其他人)的参考,我只需要在子视图的rv到false中使用setFocusable(),并且当片段可见时,它不再聚焦到该视图。

在我的情况下,我必须在从API加载数据后以编程方式进行设置。

+0

这已经解决了这个问题。谢谢。您只需确保如果根回收查看实例是应该标记为可重点为false的那些实例。 –

2

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

0

短提示@albertvilacalvo答案: 如果使用RecyclerView编程,你可以处理setFocusableInTouchMode这种方式(包括在您RecyclerView类)

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

的descendantFocusability解决方案失败,如果你在你的孩子的意见需要的EditText ,他们不会再得到光标了。我在我的RecyclerView孩子中使用ListView,自定义(多)touch和EditText。至今没有使用setFocusableInTouchMode的副作用。

0

经过漫长的搜索后,我对参数reverseLayout的设置为true。我换成

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

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