Pour mon application, j'utilise une RecyclerView
dans une ScrollView
où la RecyclerView
a une hauteur basée sur son contenu à l'aide de cette bibliothèque . Le défilement fonctionne, mais il ne fonctionne pas correctement lorsque je fais défiler la RecyclerView
. Lorsque je fais défiler la ScrollView
elle-même, le défilement se fait en douceur.
Le code que j'utilise pour définir la RecyclerView
:
LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), Android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));
La RecyclerView
dans la ScrollView
:
<Android.support.v7.widget.RecyclerView
Android:layout_marginTop="10dp"
Android:layout_marginBottom="10dp"
Android:id="@+id/friendsList"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
Essayez de faire:
RecyclerView v = (RecyclerView) findViewById(...);
v.setNestedScrollingEnabled(false);
Vous pouvez également modifier votre mise en page à l'aide de la bibliothèque de conception de support. Je suppose que votre disposition actuelle ressemble à quelque chose comme:
<ScrollView >
<LinearLayout >
<View > <!-- upper content -->
<RecyclerView > <!-- with custom layoutmanager -->
</LinearLayout >
</ScrollView >
Vous pouvez modifier cela pour:
<CoordinatorLayout >
<AppBarLayout >
<CollapsingToolbarLayout >
<!-- with your content, and layout_scrollFlags="scroll" -->
</CollapsingToolbarLayout >
</AppBarLayout >
<RecyclerView > <!-- with standard layoutManager -->
</CoordinatorLayout >
Cependant, il s’agit d’une route plus longue à prendre. Si vous êtes d'accord avec le gestionnaire de disposition linéaire personnalisé, désactivez simplement le défilement imbriqué dans la vue du recycleur.
La version v 23.2
des bibliothèques de support inclut désormais une fonctionnalité d'usine «contenu intégré» dans tous les LayoutManager
s par défaut. Je ne l’ai pas testé, mais vous devriez probablement le préférer à la bibliothèque que vous utilisiez.
<ScrollView >
<LinearLayout >
<View > <!-- upper content -->
<RecyclerView > <!-- with wrap_content -->
</LinearLayout >
</ScrollView >
Je n'avais besoin que d'utiliser ceci:
mMyRecyclerView.setNestedScrollingEnabled(false);
dans ma méthode onCreateView()
.
Merci beaucoup!
Vous pouvez utiliser cette méthode soit:
Ajoutez cette ligne à votre recyclerView xml:
Android:nestedScrollingEnabled="false"
ou en code Java:
RecyclerView.setNestedScrollingEnabled(false);
espérons que cela a aidé.
Vous pouvez essayer avec les deux manières avec XML et par programme. Mais le problème que vous pouvez rencontrer est (sous API 21) en le faisant avec XML ne fonctionnera pas. Il est donc préférable de le définir par programme dans votre activité/fragment.
Code XML:
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycleView"
Android:layout_width="match_parent"
Android:visibility="gone"
Android:nestedScrollingEnabled="false"
Android:layout_height="wrap_content"
Android:layout_below="@+id/linearLayoutBottomText" />
Par programme:
recycleView = (RecyclerView) findViewById(R.id.recycleView);
recycleView.setNestedScrollingEnabled(false);
J'ai eu des problèmes similaires (j'ai essayé de créer un RecyclerViews imbriqué similaire au design Google PlayStore). Le meilleur moyen de résoudre ce problème consiste à sous-classer l'enfant RecyclerViews et à remplacer les méthodes 'onInterceptTouchEvent' et 'onTouchEvent'. De cette façon, vous obtenez un contrôle complet sur le comportement de ces événements et éventuellement sur leur défilement.
Résumé de toutes les réponses (avantages et inconvénients)
Pour le recyclage unique
vous pouvez l'utiliser dans la mise en page du coordinateur.
Avantage - il ne chargera pas des éléments entiers de la vue recyclée. Chargement en douceur.
Inconvénient - Vous ne pouvez pas charger deux vues recyclées dans la présentation du coordinateur - des problèmes de défilement sont générés.
référence - https://stackoverflow.com/a/33143512/3879847
Pour les vues multiples multiples avec un minimum de lignes
vous pouvez charger à l'intérieur de NestedScrollView
Avantage - il défilera sans à-coups
Inconvénient - Il charge toutes les lignes de recyclerview afin que votre activité s'ouvre avec retard
référence - https://stackoverflow.com/a/33143512/3879847
Pour les vues multiples multiples avec de grandes lignes (plus de 100)
Vous devez aller avec recyclerview.
Avantage - Faites défiler en douceur, chargez en douceur
Inconvénient - Vous devez écrire plus de code et de logique.
Chargez chaque vue de recyclage dans la vue de recyclage principale avec l'aide de plusieurs utilisateurs.
ex:
MainRecyclerview
-ChildRecyclerview1 (ViewHolder1) -ChildRecyclerview2 (ViewHolder2) -ChildRecyclerview3 (ViewHolder3) -Any other layout (ViewHolder4)
Référence de multi-viewHolder - https://stackoverflow.com/a/26245463/3879847
Ou vous pouvez simplement définir Android:focusableInTouchMode="true"
dans votre vue recycleur
<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<Android.support.constraint.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<Android.support.constraint.ConstraintLayout
Android:id="@+id/constraintlayout_main"
Android:layout_width="match_parent"
Android:layout_height="@dimen/layout_width_height_fortyfive"
Android:layout_marginLeft="@dimen/padding_margin_sixteen"
Android:layout_marginRight="@dimen/padding_margin_sixteen"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<TextView
Android:id="@+id/textview_settings"
style="@style/textviewHeaderMain"
Android:gravity="start"
Android:text="@string/app_name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
</Android.support.constraint.ConstraintLayout>
<Android.support.constraint.ConstraintLayout
Android:id="@+id/constraintlayout_recyclerview"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginStart="@dimen/padding_margin_zero"
Android:layout_marginTop="@dimen/padding_margin_zero"
Android:layout_marginEnd="@dimen/padding_margin_zero"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintlayout_main">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recyclerview_list"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:nestedScrollingEnabled="false"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
</Android.support.constraint.ConstraintLayout>
</Android.support.constraint.ConstraintLayout>
</Android.support.v4.widget.NestedScrollView>
</Android.support.constraint.ConstraintLayout>
Ce code fonctionne pour dans ConstraintLayout Android
L'utilisation de la vue de défilement imbriquée au lieu de la vue de défilement a résolu mon problème
<LinearLayout> <!--Main Layout -->
<Android.support.v4.widget.NestedScrollView>
<LinearLayout > <!--Nested Scoll View enclosing Layout -->`
<View > <!-- upper content -->
<RecyclerView >
</LinearLayout >
</Android.support.v4.widget.NestedScrollView>
</LinearLayout>
Si vous utilisez VideoView ou des widgets de poids lourd dans vos vues enfants, conservez votre RecyclerView avec height wrap_content À l'intérieur d'un NestedScrollView avec height match_parent Ensuite, le défilement fonctionne aussi bien que vous le souhaitez.
Pour votre information,
<Android.support.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.v7.widget.RecyclerView
Android:layout_width="match_parent"
Android:nestedScrollingEnabled="false"
Android:layout_height="wrap_content"
Android:clipToPadding="false" />
</Android.support.v4.widget.NestedScrollView>
Merci Micro c'était de ton indice
karthik
Code XML:
<Android.support.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.v7.widget.RecyclerView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:clipToPadding="false" />
</Android.support.v4.widget.NestedScrollView>
en code Java:
recycleView = (RecyclerView) findViewById(R.id.recycleView);
recycleView.setNestedScrollingEnabled(false);