2016-06-22 11 views
18

w widoku pager Mam kilka fragmentów, jeden z nich używa zagnieżdżonego Scrollview z nagłówkiem i recyclerview:zagnieżdżona Scrollview + recyclerview, dziwne zachowanie Autoscroll

<android.support.v4.widget.NestedScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/scrollview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="com.m360.android.fragment.Members.MemberDetailsFragment"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:paddingTop="20dp"> 

     <header/> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:clipToPadding="false" 
      android:paddingTop="0dp" /> 

    </LinearLayout> 

</android.support.v4.widget.NestedScrollView> 

Tag „header” reprezentuje złożony układ nie chciałem tu pisać, ponieważ bardzo mocno koduje.

kiedy przełączam się między zakładkami, przewijam cieśninę do widoku recyklera. Nagłówek jest ukryty, muszę przewinąć w górę, aby go zobaczyć.

Jakieś pomysły na co to powoduje? Nie chcę używać typu w adapterze, jeśli mogę tego uniknąć.

Odpowiedz

46

Jak Harshit powiedział Android prevent nested recyclerview from automatically repositioning

można dodać ten atrybut do układu liniowego. Linear Layout jest bezpośrednim dzieckiem twojego scrollView.

android:descendantFocusability="blocksDescendants" 

To pomogło mi.

+1

Wyłącza childview za focus.So nie jest dotykalne lub już klikalne ... Wszelkie sugestie lub alternatywą dla tego problemu? –

+0

Nie, nie ma. Używałem tego rozwiązania wiele razy, działa. Może masz problem z innym miejscem w kodzie? – MaxF

+0

Nie ... Problem polegał tylko na tym. Usunąłem to i wszystko działało dobrze. Rozwiązałem problem autoskalowania pisząc android: focusableInTouchMode = "true" w układzie nadrzędnym widoku Recyclerview. –

13

Mamy podobny problem. Mamy pionowy RecyclerView. Każdy element tego pionka RecyclerView zawiera poziomy RecyclerView, podobnie jak w aplikacji Android TV.

Kiedy uaktualniliśmy biblioteki wsparcia z 23.4.0 do 24.0.0, nagle pojawił się automatyczny scroll. W szczególności, gdy otwieramy Activity, a następnie cofamy, pionowy RecyclerView przewija się w górę, aby bieżący poziomy wiersz RecyclerView nie został obcięty, a wiersz jest wyświetlany w całości.

Dodanie android:descendantFocusability="blocksDescendants" rozwiązuje problem.

Jednak znalazłem another solution, który również działa. W naszym przypadku pionowa RecyclerView jest zawarta wewnątrz FrameLayout. Jeśli dodaję android:focusableInTouchMode="true" do tego FrameLayout, problem zniknie.

Istnieje nawet third solution mentioned here, który zasadniczo polega na wywołaniu setFocusable(false) na urządzeniu podrzędnym/wewnętrznym RecyclerView. Nie próbowałem tego.

Nawiasem mówiąc, istnieje open issue on the AOSP.

+0

Czy wybrałeś drugie rozwiązanie? dlaczego myślisz, że jest lepiej?dzięki –

+0

@RenaudFavier I opded dla 'android: descendantFocusability =" blokuje opcję "Kopciuszki". Myślę, że 3 prezentowane rozwiązania robią coś podobnego (w zasadzie uniemożliwiają dziecku/wewnętrznemu "RecyclerView" uzyskanie ostrości, co uniemożliwia autoscroll). Jednak [spójrz na to] (https://code.google.com/p/android/issues/detail?id=81854#c11), aby lepiej zrozumieć problem. –

+0

@RenaudFavier Mogę użyć sztuczki 'android: focusableInTouchMode =" true "' do kradzieży fokusu, ponieważ mam swój zewnętrzny "RecyclerView' zawinięty w' FrameLayout'. Nie jestem pewien, czy możesz to zrobić, jeśli zewnętrzny "RecyclerView" jest korzeniem twojego układu. –

1

setFocusableInTouchMode=true dla układu dziecka (może być LinearLayout) od NestedScrollView