web-dev-qa-db-fra.com

Le recyclage dans ScrollView ne défile pas en douceur

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" />
142
Bart Bergmans

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.

Modifier (4/3/2016)

La version v 23.2 des bibliothèques de support inclut désormais une fonctionnalité d'usine «contenu intégré» dans tous les LayoutManagers 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 >
330
natario

Je n'avais besoin que d'utiliser ceci:

mMyRecyclerView.setNestedScrollingEnabled(false);

dans ma méthode onCreateView().

Merci beaucoup!

69
Victor Augusto

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

25
tahaDev

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);
8
Pramod Baggolli

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.

2
mahabudhi

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

0
Ranjith Kumar

Ou vous pouvez simplement définir Android:focusableInTouchMode="true" dans votre vue recycleur

0
Sandeep Devrari
<?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

0
Hits sapra

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>
0
Siddy Hacks

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

0
pkarthik developer

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);
0
Mohsinali