Je ne peux pas désactiver le défilement dans le RecyclerView
. J'ai essayé d'appeler rv.setEnabled(false)
mais je peux toujours faire défiler.
Comment désactiver le défilement?
android
scroll
android-recyclerview
Zsolt Safrany
la source
la source
RecyclerView
si vous ne souhaitez pas faire défiler?View
sur le dessusRecyclerView
, basculant entreVISIBLE
etGONE
selon les besoins, mais au départ, votre approche semble raisonnable.Réponses:
Pour cela, vous devez remplacer le gestionnaire de mise en page de votre vue de recyclage. De cette façon, il ne désactivera que le défilement, aucune des autres fonctionnalités. Vous pourrez toujours gérer les clics ou tout autre événement tactile. Par exemple:-
Original:
Ici, en utilisant l'indicateur "isScrollEnabled", vous pouvez activer / désactiver temporairement la fonctionnalité de défilement de votre vue de recyclage.
Aussi:
Remplacez simplement votre implémentation existante pour désactiver le défilement et autoriser les clics.
la source
La vraie réponse est
Plus d'informations dans la documentation
la source
NestedScrollView
:android.support.v4.widget.NestedScrollView
, comme décrit ici, par chessdork: stackoverflow.com/questions/37846245/...La RÉELLE RÉELLE réponse est: Pour API 21 et plus:
Aucun code java nécessaire. Vous pouvez définir
android:nestedScrollingEnabled="false"
en xml:la source
Cette solution de contournement un peu hack mais cela fonctionne; vous pouvez activer / désactiver le défilement dans le
RecyclerView
.Il s'agit d'un vide
RecyclerView.OnItemTouchListener
volant chaque événement tactile, désactivant ainsi la cibleRecyclerView
.En l'utilisant:
la source
Cela fonctionne pour moi:
la source
Custom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
return e.getAction() == MotionEvent.ACTION_MOVE;
lieu dereturn true;
cela, seuls les événements scroll / swipe sont annulés.Vous pouvez désactiver le défilement en gelant votre RecyclerView.
Geler:
recyclerView.setLayoutFrozen(true)
Pour dégeler:
recyclerView.setLayoutFrozen(false)
la source
Créer une classe qui étend la classe RecyclerView
Cela désactivera l'événement de défilement, mais pas les événements de clic
Utilisez ceci dans votre XML, procédez comme suit:
la source
Si vous désactivez uniquement la fonctionnalité de défilement de,
RecyclerView
vous pouvez utiliser lasetLayoutFrozen(true);
méthode deRecyclerView
. Mais il ne peut pas être désactivé de l'événement tactile.la source
la source
Il y a une réponse vraiment simple.
Le code ci-dessus désactive le défilement vertical de RecyclerView.
la source
Une autre alternative est
setLayoutFrozen
, mais elle s'accompagne d'un tas d'autres effets secondaires.https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setLayoutFrozen(boolean)
la source
A écrit une version kotlin:
usage:
la source
Étendre le
LayoutManager
et remplacercanScrollHorizontally()
etcanScrollVertically()
pour désactiver le défilement.Sachez que l'insertion d'éléments au début ne fera pas automatiquement défiler jusqu'au début, pour contourner cela, faites quelque chose comme:
la source
Je sais que cela a déjà une réponse acceptée, mais la solution ne prend pas en compte un cas d'utilisation que j'ai rencontré.
J'avais spécifiquement besoin d'un élément d'en-tête qui était toujours cliquable, mais qui désactivait le mécanisme de défilement de RecyclerView. Cela peut être accompli avec le code suivant:
la source
Comme il
setLayoutFrozen
est déconseillé, vous pouvez désactiver le défilement en gelant votre RecyclerView à l'aide desuppressLayout
.Geler:
Pour dégeler:
la source
en XML: -
Vous pouvez ajouter
android:nestedScrollingEnabled="false"
dans le fichier XML de mise en page RecyclerView enfant
ou
en Java: -
childRecyclerView.setNestedScrollingEnabled(false);
à votre RecyclerView en code Java.
Utilisation de ViewCompat (Java): -
childRecyclerView.setNestedScrollingEnabled(false);
ne fonctionnera que dans android_version> 21 appareils. pour travailler dans tous les appareils, utilisez les éléments suivantsViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
la source
Pour une raison quelconque, la réponse @Alejandro Gracia ne commence à fonctionner qu'après quelques secondes. J'ai trouvé une solution qui bloque instantanément le RecyclerView:
la source
Remplacez onTouchEvent () et onInterceptTouchEvent () et retournez false si vous n'avez pas du tout besoin de OnItemTouchListener. Cela ne désactive pas OnClickListeners de ViewHolders.
la source
Vous pouvez ajouter cette ligne après avoir configuré votre adaptateur
Votre vue de recyclage fonctionnera maintenant avec un défilement fluide
la source
Je me bats dans ce problème depuis une heure, donc je voudrais partager mon expérience, pour la solution layoutManager, c'est bien mais si vous voulez réactiver le défilement, le recycleur reviendra en haut.
La meilleure solution jusqu'à présent (pour moi du moins) utilise la méthode @Zsolt Safrany mais en ajoutant getter et setter afin que vous n'ayez pas à supprimer ou à ajouter OnItemTouchListener.
Comme suit
Usage
la source
Dans Kotlin, si vous ne voulez pas créer une classe supplémentaire juste pour définir une valeur, vous pouvez créer une classe anonyme à partir de LayoutManager:
la source
Voici comment je l'ai fait avec la liaison de données:
Au lieu du «vrai», j'ai utilisé une variable booléenne qui a changé en fonction d'une condition afin que la vue du recycleur bascule entre être désactivée et activée.
la source
Je suis tombé sur un fragment qui contient plusieurs RecycleView, donc je n'ai besoin que d'une barre de défilement au lieu d'une barre de défilement dans chaque RecycleView.
Je viens donc de mettre le ScrollView dans le conteneur parent qui contient les 2 RecycleViews et utiliser
android:isScrollContainer="false"
dans le RecycleViewla source
Ajouter
dans votre enfant de SrollView ou NestedScrollView (et parent de ListView, recyclerview et gridview)
la source
Il existe un moyen plus simple de désactiver le défilement (techniquement, il s'agit plutôt d'intercepter un événement de défilement et de le terminer lorsqu'une condition est remplie), en utilisant uniquement des fonctionnalités standard.
RecyclerView
a la méthode appeléeaddOnScrollListener(OnScrollListener listener)
, et en utilisant juste cela, vous pouvez l'empêcher de défiler, juste pour:Cas d'utilisation: disons que vous souhaitez désactiver le défilement lorsque vous cliquez sur l'un des éléments à l'intérieur
RecyclerView
afin de pouvoir effectuer certaines actions avec lui, sans être distrait par un défilement accidentel vers un autre élément, et lorsque vous avez terminé, cliquez simplement sur l'élément à nouveau pour activer le défilement. Pour cela, vous souhaitez attacherOnClickListener
à chaque élément à l'intérieurRecyclerView
, donc lorsque vous cliquez sur un élément, il basculeraisItemSelected
defalse
àtrue
. De cette façon, lorsque vous essayez de faire défiler,RecyclerView
appellera automatiquement la méthodeonScrollStateChanged
et depuis qu'il estisItemSelected
défini surtrue
, il s'arrêtera immédiatement, avant d'RecyclerView
avoir la chance, bien ... de faire défiler.Remarque: pour une meilleure convivialité, essayez d'utiliser
GestureListener
plutôt que d'OnClickListener
empêcher lesaccidental
clics.la source
stopScroll()
n'est pas de geler le défilement, c'est juste d'arrêter / d'arrêter le défilement recyclerview.isItemSelected
settrue
. Sinon, vous auriez besoin d'un RecyclerView personnalisé pour désactiver le défilement pour de bon et je voulais l'éviter car j'avais besoin d'un peu de fonctionnalités supplémentaires, que cette solution fournit.Ajoutez simplement ceci à votre recycleview en xml
comme ça
la source
Pour arrêter le défilement au toucher mais continuer à faire défiler via les commandes:
if (appTopBarMessagesRV == null) {appTopBarMessagesRV = findViewById (R.id.mainBarScrollMessagesRV);
la source