scrollview imbriqué + recyclerview, comportement autoscroll étrange

Dans un pager de vue j'ai plusieurs fragments, l'un d'eux utilise un scrollview imbriqué avec un en-tête et un recyclerview:

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

La balise "header" représente une mise en page complexe que je ne voulais pas poster ici car elle étire beaucoup le code.

Lorsque je commute entre les onglets, il fait défiler strait vers la vue recycleur. L'en-tête est caché, je dois faire défiler vers le haut pour le voir.

Des idées sur ce qui cause cela ? Je ne veux pas utiliser un type dans mon adaptateur si je peux l'éviter.

23
demandé sur Renaud Favier 2016-06-22 15:27:31

3 réponses

Comme Harshit a dit sur Android empêcher recyclerview imbriqué de repositionner automatiquement

Vous pouvez ajouter cet attribut à votre disposition linéaire. La Disposition Linéaire enfant direct de votre scrollView.

android:descendantFocusability="blocksDescendants"

Ça m'a aidé.

64
répondu MaxF 2017-05-23 12:18:28

, Nous avons un problème similaire. Nous avons une verticale RecyclerView. Chaque élément de ce RecyclerView vertical contient un RecyclerView horizontal, comme dans L'application Android TV.

Lorsque nous avons mis à jour les bibliothèques de support de 23.4.0 à 24.0.0, le défilement automatique est soudainement apparu. En particulier, lorsque nous ouvrons un Activity et que nous revenons en arrière, Le RecyclerView vertical défile vers le haut de sorte que la ligne RecyclerView horizontale actuelle ne soit pas coupée et que la ligne soit affichée complètement.

Ajout de android:descendantFocusability="blocksDescendants" résout le problème.

Cependant, j'ai trouvé une autre solution, qui travaille aussi. Dans notre cas, la verticale RecyclerView est contenue dans un FrameLayout. Si j'ajoute android:focusableInTouchMode="true" à ce FrameLayout, le problème disparaît.

Il y a même une troisième solution mentionnée ici, qui consiste essentiellement à appeler setFocusable(false) sur les RecyclerViewEnfants/Intérieurs. Je n'ai pas essayé cela.

En passant, il y a un problème ouvert sur le PSBA.

14
répondu Albert Vila Calvo 2017-05-23 10:31:37

setFocusableInTouchMode=true pour la mise en page enfant (peut être LinearLayout) de NestedScrollView

1
répondu Balu Sangem 2017-12-07 07:15:35