2016-06-22 23 views
18

In Hinblick Pager ich mehrere Fragmente haben, einer von ihnen verwendet eine verschachtelte Scrollview mit einem Header und einem recyclerview:verschachtelte Scrollview + recyclerview, merkwürdige Autoscroll Verhalten

<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> 

Der Tag „header“ stellt eine komplexe Layout das ich hier nicht posten wollte, da es den Code sehr streckt.

wenn I zwischen den Tabs wechseln, rollt sie zu dem Recycler Ansicht Straße. Die Kopfzeile ist ausgeblendet, ich muss scrollen, um sie zu sehen.

Irgendwelche Ideen zu was verursacht das? Ich möchte keinen Typ in meinem Adapter verwenden, wenn ich es vermeiden kann.

Antwort

46

Wie Harshit sagte am Android prevent nested recyclerview from automatically repositioning

Sie dieses Attribut zu Ihrem linearen Layout hinzufügen. Das lineare Layout direkte Kind von Ihrem scrollView.

android:descendantFocusability="blocksDescendants" 

Es hat mir geholfen.

+1

Es deaktiviert die childview focus.So es nicht berührbar oder anklickbare ist mehr ... vorschläge oder Alternative für dieses Problem? –

+0

Nein, tut es nicht. Ich habe diese Lösung viele Male benutzt, es funktioniert. Vielleicht hast du Probleme mit einem anderen Ort in deinem Code? – MaxF

+0

Nein ... Das Problem war, dass nur. Ich entfernte das und alles funktionierte gut. Ich löste das Problem von Autoscroll durch Schreiben von Android: focusableInTouchMode = "wahr" im übergeordneten Layout von Recyclerview. –

13

Wir haben ein ähnliches Problem. Wir haben eine vertikale RecyclerView. Jedes Element dieser vertikalen RecyclerView enthält eine horizontale RecyclerView, wie in der Android TV App.

Wenn wir die Unterstützung von Libs 23.4.0 bis 24.0.0 der automatische Scroll plötzlich aufgewertet. Insbesondere dann, wenn wir ein Activity öffnen und wir dann, gehen Sie zurück die vertikalen RecyclerView blättert nach oben, so dass die aktuelle horizontalen RecyclerView Reihe bekommt nicht geschnitten und die Zeile wird vollständig angezeigt.

Hinzufügen android:descendantFocusability="blocksDescendants" behebt das Problem.

Allerdings habe ich another solution, gefunden, die auch funktioniert. In unserem Fall ist die vertikale RecyclerView in einem FrameLayout enthalten. Wenn ich android:focusableInTouchMode="true" zu diesem FrameLayout hinzufügen, verschwindet das Problem.

Es gibt sogar eine third solution mentioned here, die im Wesentlichen besteht aus Aufruf setFocusable(false) auf dem Kind/inneren RecyclerView s. Ich habe das nicht versucht.

Übrigens gibt es eine open issue on the AOSP.

+0

Haben Sie sich für die zweite Lösung entschieden? Warum denkst du ist es besser?danke –

+0

@RenaudFavier Ich entschied mich für die Option "android: demcendantFocusability =" blocksDescendants "". Ich denke, dass die 3 vorgestellten Lösungen etwas Ähnliches tun (grundsätzlich verhindern, dass das Kind/innere "RecyclerView" den Fokus erhält, was das Autoscroll verhindert). Sehen Sie sich dies jedoch an (https://code.google.com/p/android/issues/detail?id=81854#c11), um das Problem besser zu verstehen. –

+0

@RenaudFavier Ich kann den 'android: focusableInTouchMode =" true "' Trick verwenden, um den Fokus zu stehlen, da ich meine äußere 'RecyclerView' in ein' FrameLayout' gehüllt habe. Ich bin nicht sicher, ob Sie das tun können, wenn die äußere 'RecyclerView' die Wurzel Ihres Layouts ist. –

1

setFocusableInTouchMode=true für Kind Layout (kann LinearLayout sein) von NestedScrollView