web-dev-qa-db-fra.com

scrollview + imbriqué imbriqués, comportement étrange de défilement automatique

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

<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 publier ici car elle étire beaucoup le code.

lorsque je bascule entre les onglets, il défile directement vers la vue du 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 ça? Je ne veux pas utiliser de type dans mon adaptateur si je peux l'éviter.

30
Renaud Favier

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

Lorsque nous avons mis à niveau 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 ensuite en arrière, la verticale RecyclerView défile vers le haut afin que la ligne horizontale actuelle RecyclerView ne soit pas coupée et la ligne s'affiche complètement.

L'ajout de Android:descendantFocusability="blocksDescendants" Résout le problème.

Cependant, j'ai trouvé ne autre solution , qui fonctionne également. Dans notre cas, le RecyclerView vertical est contenu dans un FrameLayout. Si j'ajoute Android:focusableInTouchMode="true" À ce FrameLayout, le problème disparaît.

Il y a même un troisième solution mentionnée ici , qui consiste essentiellement à appeler setFocusable(false) sur l'enfant/intérieur RecyclerViews. Je n'ai pas essayé ça.

Par ailleurs, il y a un problème ouvert sur l'AOSP .

20

ensembleAndroid:focusableInTouchMode="true" pour Layout enfant (peut être LinearLayout) de NestedScrollView

3
Balu Sangem