Comment désactiver le défilement RecyclerView?

Je ne peux pas désactiver le défilement dans RecyclerView . J'ai essayé d'appeler rv.setEnabled(false) mais je peux toujours faire défiler.

Comment puis-je désactiver le défilement?

  • Comment mettre un attribut CardView dans un style?
  • L'activité de la carte Android s'arrête lorsque vous quittez l'activité
  • GetExternalFilesDir alternative dans Android 2.1
  • Permis d'outils de développement Je n'ai pas configuré
  • Android java.net.SocketException: socket failed: EACCES (permission refusée)
  • Android - Personnalisé Nouvel écran d'appel entrant
  • 14 Solutions collect form web for “Comment désactiver le défilement RecyclerView?”

    Vous devez remplacer le gestionnaire de mise en page de votre recycleview pour cela. De cette façon, il ne désactivera que le défilement, aucune des autres fonctionnalités. Vous pourrez toujours gérer le clic ou tout autre événement tactile. Par exemple:-

    Original:

      public class CustomGridLayoutManager extends LinearLayoutManager { private boolean isScrollEnabled = true; public CustomGridLayoutManager(Context context) { super(context); } public void setScrollEnabled(boolean flag) { this.isScrollEnabled = flag; } @Override public boolean canScrollVertically() { //Similarly you can customize "canScrollHorizontally()" for managing horizontal scroll return isScrollEnabled && super.canScrollVertically(); } } 

    Ici, utilisant le drapeau "isScrollEnabled", vous pouvez activer / désactiver temporairement la fonctionnalité de défilement de votre image de recyclage.

    Aussi:

    Simple annulez votre implémentation existante pour désactiver le défilement et permettre de cliquer.

      linearLayoutManager = new LinearLayoutManager(context) { @Override public boolean canScrollVertically() { return false; } }; 

    La vraie réponse est

     recyclerView.setNestedScrollingEnabled(false); 

    Plus d'informations dans la documentation

    Ce problème est un peu difficile, mais cela fonctionne; Vous pouvez activer / désactiver le défilement dans RecyclerView .

    Il s'agit d'un RecyclerView.OnItemTouchListener vide qui détruit chaque événement tactile, désactivant ainsi la cible RecyclerView .

     public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { return true; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } } 

    En l'utilisant:

     RecyclerView rv = ... RecyclerView.OnItemTouchListener disabler = new RecyclerViewDisabler(); rv.addOnItemTouchListener(disabler); // disables scolling // do stuff while scrolling is disabled rv.removeOnItemTouchListener(disabler); // scrolling is enabled again 

    Cela fonctionne pour moi:

      recyclerView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); 

    Étendez le LayoutManager et canScrollHorizontally() et canScrollVertically() pour désactiver le défilement.

    Soyez conscient que l'insertion d'éléments au début ne se redressera pas automatiquement vers le début, pour contourner ceci, faites quelque chose comme:

      private void clampRecyclerViewScroll(final RecyclerView recyclerView) { recyclerView.getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onItemRangeInserted(int positionStart, int itemCount) { super.onItemRangeInserted(positionStart, itemCount); // maintain scroll position at top if (positionStart == 0) { RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { ((GridLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0); }else if(layoutManager instanceof LinearLayoutManager) { ((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0); } } } }); } 

    Une autre alternative est setLayoutFrozen , mais elle comporte d'autres effets secondaires.

    https://developer.android.com/fre/default.html

    Je sais que cela a déjà une réponse acceptée, mais la solution ne tient pas compte d'un cas d'utilisation que j'ai rencontré.

    J'ai spécifiquement besoin d'un élément d'en-tête encore cliquable, mais j'ai désactivé le mécanisme de défilement de RecyclerView. Cela peut être accompli avec le code suivant:

     recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { return e.getAction() == MotionEvent.ACTION_MOVE; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); 

    Vous pouvez également définir android:nestedScrollingEnabled="false" dans xml:

     <android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="true" android:nestedScrollingEnabled="false" tools:listitem="@layout/adapter_favorite_place"> 

    Pour une raison quelconque, @Alejandro Gracia, la réponse commence à fonctionner seulement après quelques secondes. J'ai trouvé une solution qui bloque instantanément le RecyclerView:

     recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { return true; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); 
     recyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { // Stop only scrolling. return rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING; } }); 

    Créer une classe qui étend la classe RecyclerView

      public class NonscrollRecylerview extends RecyclerView { public NonscrollRecylerview(Context context) { super(context); } public NonscrollRecylerview(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public NonscrollRecylerview(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); } } 

    Cela désactivera l'événement de défilement, mais pas les événements de clic

    Utilisez ceci dans votre XML, faites ce qui suit:

      <com.yourpackage.xyx.NonscrollRecylerview ... ... > ... ... </com.yourpackage.xyz.NonscrollRecylerview > 

    Remplacer onTouchEvent () et onInceptceptTouchEvent () et renvoyer false si vous n'avez pas besoin de OnItemTouchListener du tout. Cela ne désactive pas OnClickListeners de ViewHolders.

     public class ScrollDisabledRecyclerView extends RecyclerView { public ScrollDisabledRecyclerView(Context context) { super(context); } public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent e) { return false; } @Override public boolean onInterceptTouchEvent(MotionEvent e) { return false; } } 

    J'ai été en train de lutter pour ce problème pendant une heure. Donc, je voudrais partager mon expérience. Pour la solution layoutManager, ça va bien, mais si vous souhaitez réécrire le défilement, le recycleur sera remonté.

    La meilleure solution jusqu'à présent (pour moi au moins) utilise @Zsolt Safrany methode, mais en ajoutant getter et setter afin que vous ne devez pas supprimer ou ajouter OnItemTouchListener.

    Comme suit

     public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener { boolean isEnable = true; public RecyclerViewDisabler(boolean isEnable) { this.isEnable = isEnable; } public boolean isEnable() { return isEnable; } public void setEnable(boolean enable) { isEnable = enable; } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { return !isEnable; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) {} @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept){} } 

    Usage

     RecyclerViewDisabler disabler = new RecyclerViewDisabler(true); feedsRecycler.addOnItemTouchListener(disabler); // TO ENABLE/DISABLE JUST USE THIS disabler.setEnable(enable); 

    Voici comment je l'ai fait avec la liaison de données:

      <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:clipChildren="false" android:onTouch="@{(v,e) -> true}"/> 

    Au lieu de la "vraie", j'ai utilisé une variable booléenne qui a changé en fonction d'une condition afin que la vue du recycleur change entre être désactivé et activé.

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