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.
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é.
, 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 RecyclerView
Enfants/Intérieurs. Je n'ai pas essayé cela.
En passant, il y a un problème ouvert sur le PSBA.
setFocusableInTouchMode=true
pour la mise en page enfant (peut être LinearLayout
) de NestedScrollView