W mojej aplikacji korzystam z RecyclerView
wnętrza, w ScrollView
którym RecyclerView
wysokość ma wysokość w oparciu o zawartość przy użyciu tej biblioteki . Przewijanie działa, ale nie działa płynnie, gdy przewijam RecyclerView
. Kiedy przewijam ScrollView
sam, przewija się płynnie.
Kod, którego używam do zdefiniowania RecyclerView
:
LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));
RecyclerView
W ScrollView
:
<android.support.v7.widget.RecyclerView
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:id="@+id/friendsList"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android
android-recyclerview
android-scrollview
android-scroll
Bart Bergmans
źródło
źródło
androidx.constraintlayout.widget.ConstraintLayout
z rozwiązania, które rozwiąże Twój problem bez żadnych skomplikowanych implementacjiOdpowiedzi:
Spróbuj zrobić:
Alternatywnie możesz zmodyfikować układ za pomocą biblioteki projektu wsparcia. Myślę, że twój obecny układ jest podobny do:
Możesz to zmienić, aby:
Jest to jednak długa droga, a jeśli nie masz nic przeciwko niestandardowemu menedżerowi układu liniowego, wyłącz po prostu przewijanie zagnieżdżone w widoku recyklera.
Edytuj (4/3/2016)
v 23.2
Wydanie bibliotek pomocniczych zawiera teraz fabryczne „content wrap” funkcję we wszystkich domyślnyLayoutManager
s. Nie przetestowałem tego, ale prawdopodobnie powinieneś preferować bibliotekę, której używasz.źródło
setNestedScrollingEnabled(false)
tylko pracował, kiedy włącza się zScrollView
dotyczącyNestedScrollView
zamiast.setNestedScrollingEnabled(false)
przywróciłem płynne przewijanie z moimRecyclerView
wnętrzemScrollView
- Dzięki! Ale nadal nie rozumiem, dlaczego to działa ...? Co tak naprawdę oznacza ustawienie false przewijania zagnieżdżonego?android:nestedScrollingEnabled="false"
działa tylko dla API 21+, alev.setNestedScrollingEnabled(false)
jest OK dla <21.RecyclerView
wypadek , gdyby ktoś miał problem z opakowaniem w środku,ScrollView
który zdarza się tylko na urządzeniach marshmallow / nougat (API 23, 24), sprawdź moje obejście na stackoverflow.com/a/38995399/132121Potrzebowałem tylko tego:
w mojej
onCreateView()
metodzie.Wielkie dzięki!
źródło
Możesz użyć tej metody:
Dodaj tę linię do pliku xml recyclinglerView:
Lub w kodzie Java:
Mam nadzieję, że to pomogło.
źródło
Możesz wypróbować oba sposoby z XML i programowo. Ale problem, z którym możesz się spotkać to (poniżej API 21), gdy robi się to z XML-em, nie będzie działać. Lepiej więc ustawić to programowo w swojej aktywności / fragmencie.
Kod XML:
Programowo:
źródło
Używanie zagnieżdżonego widoku przewijania zamiast widoku przewijania rozwiązało mój problem
źródło
Miałem podobne problemy (próbowałem utworzyć zagnieżdżony RecyclerViews podobny do projektu Google PlayStore). Najlepszym sposobem na poradzenie sobie z tym jest podklasowanie podrzędnych RecyclerViews i przesłanianie metod „onInterceptTouchEvent” i „onTouchEvent”. W ten sposób zyskujesz pełną kontrolę nad tym, jak zachowują się te zdarzenia, a następnie przewijaniem.
źródło
Zastąpienie ScrollView NestedScrollView spowodowało płynne przewijanie w dół.
źródło
Jeśli korzystasz z VideoView lub widgetów o dużej gramaturze w swoich widokach dla dzieci, zachowaj RecyclerView z wysokością
wrap_content
w NestedScrollView z wysokością, amatch_parent
następnie przewijanie będzie działało tak płynnie, jak tylko chcesz.Do Twojej wiadomości
Dzięki Micro to było z twojej wskazówki!
karthik
źródło
Podsumowanie wszystkich odpowiedzi (zalety i wady)
Dla pojedynczego podglądu recyklera
możesz go użyć w układzie koordynatora.
Zaleta - nie spowoduje załadowania całych przedmiotów do recyklingu. Tak płynne ładowanie.
Wada - nie można załadować dwóch widoków recyklera w układzie koordynatora - powoduje to problemy z przewijaniem
odniesienie - https://stackoverflow.com/a/33143512/3879847
Dla wielu recylerview z minimalnymi rzędami
możesz załadować do NestedScrollView
Zaleta - przewinie się płynnie
Wada - ładuje wszystkie rzędy widoku recyklera, dzięki czemu Twoja aktywność otwiera się z opóźnieniem
odniesienie - https://stackoverflow.com/a/33143512/3879847
Dla wielu recylerview z dużymi rzędami (ponad 100)
Musisz przejść z recyklingiem.
Zaleta - Przewijaj płynnie, ładuj płynnie
Wada - Musisz napisać więcej kodu i logiki
Załaduj każdy recylerview do głównego widoku recyklera za pomocą wielu przeglądarek
dawny:
Odniesienie do multi-viewHolder - https://stackoverflow.com/a/26245463/3879847
źródło
Kod XML:
w kodzie java:
źródło
Lub możesz po prostu ustawić
android:focusableInTouchMode="true"
w widoku recykleraźródło
Ten kod działa w systemie Android ConstraintLayout
źródło
Kotlin
Ustaw
isNestedScrollingEnabled
sięfalse
za każdym RecyclerView że jest pod widoku przewijaniaKorzystanie z układu XML
źródło