Nie mogę wyłączyć przewijania w RecyclerView
. Próbowałem dzwonić, rv.setEnabled(false)
ale nadal mogę przewijać.
Jak mogę wyłączyć przewijanie?
android
scroll
android-recyclerview
Zsolt Safrany
źródło
źródło
RecyclerView
jeśli nie chcesz przewijać?View
góręRecyclerView
, przełączając pomiędzyVISIBLE
iGONE
w razie potrzeby, ale poza mankietem twoje podejście wydaje się rozsądne.Odpowiedzi:
W tym celu należy zastąpić menedżera układu w widoku kosza. W ten sposób wyłącza tylko przewijanie, bez żadnej innej funkcjonalności. Nadal będziesz w stanie obsługiwać zdarzenia kliknięcia lub inne zdarzenia dotykowe. Na przykład:-
Oryginalny:
Za pomocą flagi „isScrollEnabled” możesz tymczasowo włączyć / wyłączyć funkcję przewijania w widoku kosza.
Również:
Wystarczy zastąpić istniejącą implementację, aby wyłączyć przewijanie i umożliwić klikanie.
źródło
Prawdziwa odpowiedź brzmi
Więcej informacji w dokumentacji
źródło
NestedScrollView
:android.support.v4.widget.NestedScrollView
jak opisano tutaj, przez chessdork: stackoverflow.com/questions/37846245/…PRAWDZIWA PRAWDZIWA odpowiedź brzmi: dla API 21 i wyższych:
Kod Java nie jest potrzebny. Możesz ustawić
android:nestedScrollingEnabled="false"
w xml:źródło
Jest to nieco hackerskie obejście, ale działa; możesz włączyć / wyłączyć przewijanie w
RecyclerView
.Jest to puste
RecyclerView.OnItemTouchListener
kradnięcie każdego zdarzenia dotyku, co powoduje wyłączenie celuRecyclerView
.Użyj tego:
źródło
To działa dla mnie:
źródło
Custom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
return e.getAction() == MotionEvent.ACTION_MOVE;
zamiast tegoreturn true;
anulowane są tylko zdarzenia przewijania / machnięcia.Możesz wyłączyć przewijanie, zamrażając RecyclerView.
Zamrażać:
recyclerView.setLayoutFrozen(true)
Aby odmrozić:
recyclerView.setLayoutFrozen(false)
źródło
Utwórz klasę rozszerzającą klasę RecyclerView
Spowoduje to wyłączenie zdarzenia przewijania, ale nie zdarzenia kliknięcia
Użyj tego w swoim XML, wykonaj następujące czynności:
źródło
Jeśli po prostu wyłączyć tylko funkcjonalność przewijania z
RecyclerView
czym można użyćsetLayoutFrozen(true);
metodyRecyclerView
. Ale nie można wyłączyć zdarzenia dotykowego.źródło
źródło
Istnieje naprawdę prosta odpowiedź.
Powyższy kod wyłącza przewijanie w pionie RecyclerView.
źródło
Inną alternatywą jest
setLayoutFrozen
, ale wiąże się z nią szereg innych skutków ubocznych.https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setLayoutFrozen(boolean)
źródło
Napisałem wersję kotlin:
stosowanie:
źródło
Rozwiń
LayoutManager
i zastąpcanScrollHorizontally()
i,canScrollVertically()
aby wyłączyć przewijanie.Pamiętaj, że wstawianie elementów na początku nie spowoduje automatycznego przewinięcia do początku, aby obejść ten problem, wykonaj następujące czynności:
źródło
Wiem, że ma to już zaakceptowaną odpowiedź, ale rozwiązanie nie uwzględnia przypadku, z którym się spotkałem.
W szczególności potrzebowałem elementu nagłówka, który nadal można było kliknąć, ale wyłączyłem mechanizm przewijania RecyclerView. Można to osiągnąć za pomocą następującego kodu:
źródło
Jak
setLayoutFrozen
jest przestarzałe, możesz wyłączyć przewijanie, zamrażając RecyclerView za pomocąsuppressLayout
.Zamrażać:
Aby odmrozić:
źródło
w XML: -
Możesz dodać
android:nestedScrollingEnabled="false"
w podrzędnym pliku XML układu RecyclerView
lub
w Javie: -
childRecyclerView.setNestedScrollingEnabled(false);
do RecyclerView w kodzie Java.
Za pomocą ViewCompat (Java): -
childRecyclerView.setNestedScrollingEnabled(false);
będzie działać tylko na urządzeniach z Androidem> 21 . do pracy na wszystkich urządzeniach użyj następującychViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
źródło
Z jakiegoś powodu @Alejandro Gracia odpowiedź zaczyna działać dopiero po kilku sekundach. Znalazłem rozwiązanie, które natychmiast blokuje RecyclerView:
źródło
Zastąp onTouchEvent () i onInterceptTouchEvent () i zwróć false, jeśli w ogóle nie potrzebujesz OnItemTouchListener. To nie wyłącza OnClickListeners z ViewHolders.
źródło
Możesz dodać ten wiersz po ustawieniu adaptera
Teraz Twój recykler będzie działał z płynnym przewijaniem
źródło
Walczę w tym numerze od kilku godzin, więc chciałbym podzielić się swoim doświadczeniem. W przypadku rozwiązania layoutManager jest w porządku, ale jeśli chcesz ponownie włączyć przewijanie, recykler wróci na górę.
Najlepszym jak dotąd rozwiązaniem (przynajmniej dla mnie) jest użycie metody @Zsolt Safrany, ale dodanie gettera i settera, abyś nie musiał usuwać ani dodawać OnItemTouchListener.
Następująco
Stosowanie
źródło
W Kotlin, jeśli nie chcesz tworzyć dodatkowej klasy tylko dla ustawienia jednej wartości, możesz utworzyć anonimową klasę z LayoutManager:
źródło
Oto jak to zrobiłem z powiązaniem danych:
Zamiast „true” użyłem zmiennej boolowskiej, która zmieniła się w zależności od warunku, tak aby widok recyklera przełączał się między wyłączeniem i włączeniem.
źródło
Przeszedłem z fragmentem zawierającym wiele RecycleView, więc potrzebuję tylko jednego paska przewijania zamiast jednego paska przewijania w każdym RecycleView.
Więc po prostu umieściłem ScrollView w kontenerze nadrzędnym, który zawiera 2 RecycleViews i używam go
android:isScrollContainer="false"
w RecycleViewźródło
Dodaj
w twoim dziecku SrollView lub NestedScrollView (i nadrzędnym ListView, recyclinglerview i gridview dowolny)
źródło
Istnieje prostszy sposób wyłączenia przewijania (technicznie jest to raczej przechwytywanie zdarzenia przewijania i kończenie go, gdy spełniony jest warunek), przy użyciu tylko standardowej funkcjonalności.
RecyclerView
ma wywoływaną metodęaddOnScrollListener(OnScrollListener listener)
, a właśnie za pomocą tego można zatrzymać przewijanie, tak więc:Przypadek użycia: powiedzmy, że chcesz wyłączyć przewijanie po kliknięciu jednego z elementów
RecyclerView
, abyś mógł z nim wykonać pewne czynności, bez rozpraszania się przypadkowym przewinięciem do innego elementu, a kiedy to zrobisz, po prostu kliknij element ponownie, aby umożliwić przewijanie. W tym celu chcesz dołączyćOnClickListener
do każdego elementu w środkuRecyclerView
, więc po kliknięciu elementu zmieni sięisItemSelected
zfalse
natrue
. W ten sposób, gdy spróbujesz przewijać,RecyclerView
automatycznie wywoła metodę,onScrollStateChanged
a ponieważisItemSelected
ustawione natrue
, zatrzyma się natychmiast, zanim pojawiRecyclerView
się szansa, no cóż ... przewinąć.Uwaga: dla lepszej użyteczności spróbuj użyć
GestureListener
zamiastOnClickListener
zapobiegaćaccidental
kliknięciom.źródło
stopScroll()
to nie zamrożenie zwoju, to po prostu zatrzymanie / zatrzymanie przewijania.isItemSelected
ustawionym natrue
. W przeciwnym razie potrzebujesz niestandardowego RecyclerView, aby na stałe wyłączyć przewijanie i chciałem tego uniknąć, ponieważ potrzebowałem tylko trochę dodatkowej funkcjonalności, jaką zapewnia to rozwiązanie.Po prostu dodaj to do swojego widoku w formacie xml
lubię to
źródło
Aby zatrzymać przewijanie dotykowe, ale przewijaj za pomocą poleceń:
if (appTopBarMessagesRV == null) {appTopBarMessagesRV = findViewById (R.id.mainBarScrollMessagesRV);
źródło