2016-08-15 141 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));