Désactiver le défilement dans l'enfant Recyclerview android

J'ai une mise en page consiste en un RecyclerView Parent avec un sous Recyclerview en elle

Je sais qu'il n'est pas bon de mettre une liste dans une autre liste, mais je dois l'utiliser pour pouvoir utiliser les fonctionnalités de la sous-liste, comme la glisse et la glisser-déposer

  • API de licences de marché sur les problèmes d'émulateur Android
  • Supprimer une rangée dans la table de base de données en donnant une valeur de colonne - qui est une chaîne
  • Android WebView Nouvelle fenêtre URL
  • Android Studio Emulator ne charge pas Windows 10
  • Android: AnimationDrawable cast error
  • Gradle (plugin expérimental Android) ignore une dépendance du projet
  • Mon problème est que l'enfant Recyclerview se concentre et arrête le parent de défiler si le point de contact était sur ce que je veux simplement si le toucher était verticalement sur l'enfant Recyclerview le parent défile vers le haut et vers le bas et si le toucher était horizontal ou un clic puis L'élément enfant de l'élément Recyclerview bascule à gauche et à droite. Une aide pour y parvenir?

  • ProGuard ne fonctionne pas comme prévu après la mise à jour de Android Studio
  • La couleur de remplissage de superposition de cercle n'est pas toujours dessinée sur Google Maps v2
  • Impossible de rendre le diaphragme personnalisé transparent sur le fragment
  • Comment compiler GCC pour Android?
  • Recevoir les événements onTouch et onClick avec Android
  • Vous recherchez un exemple de la nouvelle Android API setMediaButtonReceiver
  • 7 Solutions collect form web for “Désactiver le défilement dans l'enfant Recyclerview android”

    J'ai finalement trouvé une solution.

    Créer un LinearLayoutManager personnalisé

    public class CustomLinearLayoutManager extends LinearLayoutManager { public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); } // it will always pass false to RecyclerView when calling "canScrollVertically()" method. @Override public boolean canScrollVertically() { return false; } } 

    Ensuite, instanciez-le comme ça pour le défilement vertical

     CustomLinearLayoutManager customLayoutManager = new CustomLinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false); 

    Enfin, définissez la mise en page personnalisée en tant que gestionnaire de mise en page de la vue Recycleur

     recyclerView.setLayoutManager(customLayoutManager); 

    Bien qu'il ne soit pas une bonne pratique d'avoir des vues de recyclage intégrées, parfois vous ne pouvez pas l'éviter. Quelque chose comme ça pourrait fonctionner:

     public class NoScrollRecycler extends RecyclerView { public NoScrollRecycler(Context context){ super(context); } public NoScrollRecycler(Context context, AttributeSet attrs){ super(context, attrs); } public NoScrollRecycler(Context context, AttributeSet attrs, int style){ super(context, attrs, style); } @Override public boolean dispatchTouchEvent(MotionEvent ev){ //Ignore scroll events. if(ev.getAction() == MotionEvent.ACTION_MOVE) return true; //Dispatch event for non-scroll actions, namely clicks! return super.dispatchTouchEvent(ev); } } 

    Cela désactivera l'événement de défilement, mais pas les événements de clic. Utilisez cette classe pour RecyclerView "enfant". Vous voulez que la vue de recyclage de PARENT se déplace, mais pas l'enfant. Eh bien, cela devrait le faire, puisque le parent sera juste le RecyclerView standard, mais l'enfant sera celui-ci sans défilement, mais gère les clics. Peut être nécessaire de désactiver le clic pour le parent RecyclerView .. Pas sûr car je n'ai pas testé ceci, alors considérez-le comme un exemple …

    En outre, pour utiliser cela en XML (en cas de non-respect), procédez comme suit:

     <com.yourpackage.location.NoScrollRecycler ... ... > ... ... </com.yourpackage.location.NoScrollRecycler> 

    Sur votre ActivityName.java, à l'intérieur de la méthode d'écriture onCreate ():

     RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id); v.setNestedScrollingEnabled(false); 

    Par quelque moyen que ce soit, si vous utilisez la mise en page du coordonnateur, si vous souhaitez simplifier les choses, vous souhaitez désactiver le défilement imbriqué.

      <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v7.widget.RecyclerView android:id="@+id/activitiesListRV" android:layout_width="match_parent" android:layout_height="wrap_content"/> </android.support.v4.widget.NestedScrollView> 

    Et encore une fois, vous appliquez le même principe: sur votre ActivityName.java, à l'intérieur de la méthode onCreate ():

     RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id); v.setNestedScrollingEnabled(false); 

    Donc, en principe, en XML, vous devez spécifier l'application: layout_behavior

     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    android:nestedScrollingEnabled="false" dans l'enfant RecyclerView

    Vous pouvez ajouter

     android:nestedScrollingEnabled="false" 

    À votre RecyclerView en XML ou

     childRecyclerView.setNestedScrollingEnabled(false); 

    À votre RecyclerView en Java.

    MODIFIER:-

    childRecyclerView.setNestedScrollingEnabled(false); Ne fonctionnera que dans Android android_version> 21 périphériques. Pour travailler dans tous les appareils, utilisez les éléments suivants

     ViewCompat.setNestedScrollingEnabled(childRecyclerView, false); 

    Vous pouvez utiliser setNestedScrollingEnabled (false); Sur la vue de sous-recycleur qui arrête le défilement à l'intérieur de la vue de sous-recycleur. Dans mon code de cas était

    MInnerRecyclerView.setNestedScrollingEnabled (false); Où mInnerRecyclerView est une qualité de recyclage interne

    J'ai essayé de nombreuses solutions suggérées et je n'ai pas pu trouver celle qui fonctionnait dans mon cas. J'ai plus d'une RecyclerView dans une ScrollView à l'aide d'un GridLayoutManager. Le résultat de la suggestion ci-dessus a entraîné l'arrêt ScrollView pour défiler chaque fois que je me suis levé le doigt (il n'a pas glissé en haut ou en bas de la vue lorsque mon doigt a été soulevé sur un RecyclerView)

    En regardant la source RecyclerView, à l'intérieur du OnTouchEvent, il y a un appel au gestionnaire de mise en page:

     final boolean canScrollHorizontally = mLayout.canScrollHorizontally(); final boolean canScrollVertically = mLayout.canScrollVertically(); 

    Si vous les annulez dans un gestionnaire de mise en page personnalisé, renvoyez false et arrêtera le défilement. Il corrige également le problème où la ScrollView arrête de bouger de façon abrupte.

    Si vous ne voulez pas créer une vue personnalisée, une autre option consiste à créer une mise en page de même taille devant le RecyclerView et à le rendre accessible.

    EDIT: mais malheureusement, il bloque les événements pour l'élément de la liste.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.