Ich kann das Scrollen in der nicht deaktivieren RecyclerView
. Ich habe versucht anzurufen rv.setEnabled(false)
, kann aber trotzdem scrollen.
Wie kann ich das Scrollen deaktivieren?
android
scroll
android-recyclerview
Zsolt Safrany
quelle
quelle
RecyclerView
wenn Sie nicht scrollen möchten?View
darüber gelegtRecyclerView
, zwischenVISIBLE
undGONE
nach Bedarf umgeschaltet , aber von der Manschette her scheint Ihr Ansatz vernünftig.Antworten:
Sie sollten dazu den Layoutmanager Ihrer Recycling-Ansicht überschreiben. Auf diese Weise wird nur das Scrollen deaktiviert, keine der anderen Funktionen. Sie können weiterhin Klick- oder andere Berührungsereignisse verarbeiten. Beispielsweise:-
Original:
Hier können Sie mit dem Flag "isScrollEnabled" die Bildlauffunktion Ihrer Recycling-Ansicht vorübergehend aktivieren / deaktivieren.
Ebenfalls:
Überschreiben Sie einfach Ihre vorhandene Implementierung, um das Scrollen zu deaktivieren und das Klicken zu ermöglichen.
quelle
Die wirkliche Antwort ist
Weitere Infos in der Dokumentation
quelle
NestedScrollView
:android.support.v4.widget.NestedScrollView
wie hier beschrieben, durch chessdork: stackoverflow.com/questions/37846245/...Die REAL REAL-Antwort lautet: Für API 21 und höher:
Kein Java-Code erforderlich. Sie können
android:nestedScrollingEnabled="false"
in XML festlegen :quelle
Dies ist eine etwas hackige Problemumgehung, aber es funktioniert. Sie können das Scrollen in der aktivieren / deaktivieren
RecyclerView
.Dies ist ein leerer
RecyclerView.OnItemTouchListener
Diebstahl jedes Berührungsereignisses, wodurch das Ziel deaktiviert wirdRecyclerView
.Es benutzen:
quelle
Das funktioniert bei mir:
quelle
Custom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
return e.getAction() == MotionEvent.ACTION_MOVE;
stattdessenreturn true;
nur Scroll- / Swipe-Ereignisse abgebrochen.Sie können das Scrollen deaktivieren, indem Sie RecyclerView einfrieren.
Frieren:
recyclerView.setLayoutFrozen(true)
Zum Auftauen:
recyclerView.setLayoutFrozen(false)
quelle
Erstellen Sie eine Klasse, die die RecyclerView- Klasse erweitert
Dadurch wird das Bildlaufereignis deaktiviert, nicht jedoch die Klickereignisse
Verwenden Sie dies in Ihrem XML, um Folgendes zu tun:
quelle
Wenn Sie nur deaktivieren nur Scroll - Funktionalität von
RecyclerView
dann können Sie verwendensetLayoutFrozen(true);
MethodeRecyclerView
. Es kann jedoch kein Touch-Ereignis deaktiviert werden.quelle
quelle
Es gibt eine wirklich einfache Antwort.
Der obige Code deaktiviert das vertikale Scrollen von RecyclerView.
quelle
Eine andere Alternative ist
setLayoutFrozen
, aber es kommt mit einer Reihe anderer Nebenwirkungen.https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setLayoutFrozen(boolean)
quelle
Schrieb eine Kotlin-Version:
Verwendung:
quelle
Erweitern Sie das
LayoutManager
und überschreiben SiecanScrollHorizontally()
undcanScrollVertically()
deaktivieren Sie das Scrollen.Beachten Sie, dass das Einfügen von Elementen am Anfang nicht automatisch zum Anfang zurückblättert. Um dies zu umgehen, gehen Sie wie folgt vor:
quelle
Ich weiß, dass dies bereits eine akzeptierte Antwort hat, aber die Lösung berücksichtigt keinen Anwendungsfall, auf den ich gestoßen bin.
Ich brauchte speziell ein Header-Element, das noch anklickbar war, aber den Bildlaufmechanismus von RecyclerView deaktivierte. Dies kann mit dem folgenden Code erreicht werden:
quelle
Wie
setLayoutFrozen
veraltet, können Sie das Scrollen deaktivieren, indem Sie RecyclerView mithilfe von einfrierensuppressLayout
.Frieren:
Zum Auftauen:
quelle
in XML: -
Du kannst hinzufügen
android:nestedScrollingEnabled="false"
in der untergeordneten XML-Datei des RecyclerView-Layouts
oder
in Java: -
childRecyclerView.setNestedScrollingEnabled(false);
zu Ihrem RecyclerView in Java-Code.
Verwenden von ViewCompat (Java): -
childRecyclerView.setNestedScrollingEnabled(false);
funktioniert nur in android_version> 21 Geräten. Verwenden Sie Folgendes, um auf allen Geräten zu arbeitenViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
quelle
Aus irgendeinem Grund funktioniert die Antwort von @Alejandro Gracia erst nach wenigen Sekunden. Ich habe eine Lösung gefunden, die RecyclerView sofort blockiert:
quelle
Überschreiben Sie onTouchEvent () und onInterceptTouchEvent () und geben Sie false zurück, wenn Sie OnItemTouchListener überhaupt nicht benötigen. Dadurch werden OnClickListeners von ViewHolders nicht deaktiviert.
quelle
Sie können diese Zeile hinzufügen, nachdem Sie Ihren Adapter eingestellt haben
Jetzt funktioniert Ihre Recycling-Ansicht mit reibungslosem Scrollen
quelle
Ich habe seit einigen Stunden Probleme mit dieser Ausgabe. Daher möchte ich meine Erfahrungen mitteilen. Für die layoutManager-Lösung ist dies in Ordnung, aber wenn Sie das Scrollen wieder aktivieren möchten, wird der Recycler wieder nach oben verschoben.
Die bisher beste Lösung (zumindest für mich) ist die Verwendung der @ Zsolt Safrany-Methode, aber das Hinzufügen von Getter und Setter, damit Sie den OnItemTouchListener nicht entfernen oder hinzufügen müssen.
Wie folgt
Verwendung
quelle
Wenn Sie in Kotlin keine zusätzliche Klasse nur zum Festlegen eines Werts erstellen möchten, können Sie in LayoutManager eine anonyme Klasse erstellen:
quelle
So habe ich es mit der Datenbindung gemacht:
Anstelle von "true" habe ich eine boolesche Variable verwendet, die sich aufgrund einer Bedingung geändert hat, sodass die Recycler-Ansicht zwischen deaktiviert und aktiviert wechselt.
quelle
Kam mit einem Fragment rüber, das mehrere RecycleView enthält, sodass ich in jeder RecycleView nur eine Bildlaufleiste anstelle einer Bildlaufleiste benötige.
Also habe ich einfach die ScrollView in den übergeordneten Container gestellt, der die 2 RecycleViews enthält, und sie
android:isScrollContainer="false"
in der RecycleView verwendetquelle
Hinzufügen
in Ihrem Kind von SrollView oder NestedScrollView (und einem Elternteil von ListView, Recyclerview und Gridview)
quelle
Es gibt eine einfachere Möglichkeit, das Scrollen zu deaktivieren (technisch gesehen ist es eher das Abfangen eines Bildlaufereignisses und das Beenden, wenn eine Bedingung erfüllt ist), indem nur die Standardfunktionalität verwendet wird.
RecyclerView
hat die Methode aufgerufenaddOnScrollListener(OnScrollListener listener)
, und wenn Sie nur diese verwenden, können Sie das Scrollen stoppen, nur so:Anwendungsfall: Angenommen, Sie möchten das Scrollen deaktivieren, wenn Sie auf eines der darin enthaltenen Elemente klicken,
RecyclerView
damit Sie einige Aktionen damit ausführen können, ohne durch versehentliches Scrollen zu einem anderen Element abgelenkt zu werden. Wenn Sie damit fertig sind, klicken Sie einfach auf das Element erneut, um das Scrollen zu aktivieren. Zu diesem Zweck möchten SieOnClickListener
an jedes Element in diesem Element anhängen.RecyclerView
Wenn Sie also auf ein Element klicken, wirdisItemSelected
vonfalse
zu umgeschaltettrue
. Auf diese Weise , wenn Sie blättern versuchen,RecyclerView
wird Methode automatisch aufrufenonScrollStateChanged
und daisItemSelected
Satztrue
, wird es sofort zu stoppen, bevorRecyclerView
die Chance bekam, gut ... zu blättern.Hinweis: Versuchen Sie zur besseren Benutzerfreundlichkeit, Klicks zu verwenden,
GestureListener
anstatt sieOnClickListener
zu verhindernaccidental
.quelle
stopScroll()
dient nicht zum Einfrieren der Schriftrolle, sondern nur zum Anhalten / Stoppen des Bildlaufs in der Recyclingansicht.isItemSelected
zu Satztrue
. Andernfalls benötigen Sie eine benutzerdefinierte RecyclerView, um das Scrollen endgültig zu deaktivieren, und ich wollte dies vermeiden, da ich nur ein wenig zusätzliche Funktionalität benötigte, die diese Lösung bietet.Fügen Sie dies einfach Ihrer Recycling-Ansicht in XML hinzu
so was
quelle
Um das Scrollen durch Berühren zu beenden, aber weiter über Befehle zu scrollen:
if (appTopBarMessagesRV == null) {appTopBarMessagesRV = findViewById (R.id.mainBarScrollMessagesRV);
quelle