Jak korzystać z RecyclerView
wnętrza NestedScrollView
?
RecyclerView
zawartość nie jest widoczna po ustawieniu adaptera.
Zaktualizowano kod układu UPDATE .
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/keyline_1">
</RelativeLayout>
<View
android:id="@+id/separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#e5e5e5" />
<android.support.v7.widget.RecyclerView
android:id="@+id/conversation"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
Odpowiedzi:
Zamień swój recyklerView na,
tutaj,
zajmie się resztą rzeczy.
Jeszcze jedno: nie musisz umieszczać swojego recyclinglerView w NestedScrollView
źródło
NestedScrollView
ale tylko zapp:layout_behavior="@string/appbar_scrolling_view_behavior"
. To jest klucz!CoordinatorLayout
,AppBarLayout
i odpowiednie ustawienielayout_scrollFlags
w widokach potomnych, które powinny być przewijane za pomocąRecyclerView
. Nie jestem pewien, dlaczego zostało to pominięte w odpowiedzi. W przeciwnym razie jest to miłe i proste rozwiązanie.AKTUALIZACJA 1
Od Android Support Library 23.2.0 dodano metodę
setAutoMeasureEnabled(true)
dla LayoutManagers. To sprawia, że RecyclerView zawija zawartość i działa jak urok.http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
Dodaj więc coś takiego:
AKTUALIZACJA 2
Ponieważ 27.1.0
setAutoMeasureEnabled
jest przestarzałe, należy zapewnić niestandardową implementację LayoutManager z przesłoniętą metodąisAutoMeasureEnabled()
Ale po wielu przypadkach użycia RecyclerView zdecydowanie nie zaleca się używania go w trybie owijania , ponieważ nie jest to przeznaczone do tego celu. Spróbuj przefiltrować cały układ za pomocą zwykłego pojedynczego RecyclerView z kilkoma typami przedmiotów. Lub użyj podejścia z LinearLayout, które opisałem poniżej jako ostateczność
Stara odpowiedź (niezalecana)
Możesz użyć w
RecyclerView
środkuNestedScrollView
. Przede wszystkim powinieneś wdrożyć własny niestandardowyLinearLayoutManager
, który powodujeRecyclerView
zawinięcie jego zawartości. Na przykład:Następnie użyj tego
LayoutManager
dla swojegoRecyclerView
Ale powinieneś także wywołać te dwie metody:
Tutaj
setNestedScrollingEnabled(false)
wyłącz przewijanie dlaRecyclerView
, aby nie przechwytywał zdarzenia przewijaniaNestedScrollView
. IsetHasFixedSize(false)
ustal, że zmiany w treści adaptera mogą zmienić rozmiar plikuRecyclerView
Ważna uwaga: w niektórych przypadkach to rozwiązanie jest trochę wadliwe i ma problemy z wydajnością, więc jeśli masz wiele elementów
RecyclerView
, polecam skorzystanie z niestandardowejLinearLayout
implementacji widoku listy, stwórz dla niego analog i adapter. zachowuj się jakListView
lubRecyclerView
źródło
RecyclerView
.1) Musisz użyć biblioteki wsparcia 23.2.0 (lub) powyżej
2) i
RecyclerView
wysokość będziewrap_content
.3)
recyclerView.setNestedScrollingEnabled(false)
Ale w ten sposób wzorzec recyklera nie działa . (tzn. wszystkie widoki zostaną załadowane jednocześnie, ponieważ
wrap_content
wymaga wysokości zakończenia,RecyclerView
aby narysować wszystkie elementy potomneViews at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to use
viewTypeand add all other views that need to scroll to
RecyclerViewrather than using
RecyclerViewin
Scrollview`. Wpływ na wydajność będzie bardzo wysoki.Upraszczając: „działa tak samo jak
LinearLayout
wszystkie widoki dziecka”źródło
recyclerView.setNestedScrollingEnabled(false)
pomogło mi płynnie przewijać.Możesz użyć,
android:fillViewport="true"
abyNestedScrollView
zmierzyćRecyclerView
.RecyclerView
Wypełni pozostałą wysokość. więc jeśli chcesz, aby przewinąćNestScrollView
, można ustawićRecyclerView
„sminHeight
.źródło
Po prostu dodanie
recyclerView.setNestedScrollingEnabled(false);
przedsetAdapter
sobą działało dla mnie.app:layout_behavior="@string/appbar_scrolling_view_behavior"
Nigdzie nie dodałem i nie ustawiłem żadnego niestandardowego menedżera układuźródło
To działa dla mnie
źródło
Istnieje prosty i testujący kod, który możesz sprawdzić
źródło
Na
androidx
to się nazywaandroidx.core.widget.NestedScrollView
- i to też przewija alike masło z właściwościamiisScrollContainer
imeasureAllChildren
włączona:źródło
Spróbuj użyć tej biblioteki - https://github.com/serso/android-linear-layout-manager .
LayoutManager biblioteki sprawia, że RecyclerView zawija swoją zawartość. W takim przypadku RecyclerView będzie „tak duży jak widoki wewnętrzne”, więc nie będzie miał pasków przewijania, a użytkownik użyje zdolności przewijania NestedScrollView. Dlatego nie będzie dwuznaczny jak „przewijany wewnątrz przewijalny”.
źródło
Oto kod, którego używam, aby uniknąć problemów z przewijaniem:
źródło
Użyłem RecyclerView wewnątrz NestedScrollView i zadziałało to dla mnie. Jedyne, co musiałem pamiętać, to że NestedScrollView ma tylko jeden widok potomny. Tak więc w moim przypadku skorzystałem z grupy widokowej LienearLayout, która mieściła mój RecyclerView oraz kilka innych widoków, których potrzebowałem.
Występuje jeden problem z umieszczeniem mojego RecyclerView w NestedScrollView. Uświadomiłem sobie, że przewijanie zawartości mojego RecyclerView zwolniło.
Później zdałem sobie sprawę, że mój RecyclerView odbiera zdarzenie przewijania i dlatego jest w konflikcie z zachowaniem przewijania NestedScrollView.
Aby rozwiązać ten problem, musiałem wyłączyć funkcję przewijania mojego RecyclerView za pomocą tej metody
movieListNewRecyclerView.setNestedScrollingEnabled(false);
Możesz sprawdzić mój Instagram, aby zobaczyć krótki film z tego, co faktycznie zrobiłem. To jest mój uchwyt Instagram ofelix03
Kliknij ten obraz, aby zobaczyć, co zrobiłem
źródło
Mam Viewpager i RecyclerView wewnątrz NestedScrollView. Po dodaniu poniżej wierszy
Rozwiązałem problem wolnego przewijania i opóźnienia przewijania.
źródło
recyclerView.setHasFixedSize(true);
?Nie można użyć widoku recyklera w zagnieżdżonym widoku przewijania. Nie ma on zawierać dalszych przewijalnych widoków, ale ponieważ jest to potomek samego przewijanego układu, potrzebujesz zagnieżdżonego widoku przewijania. Miałem ten sam problem, ale ostatecznie przeniosłem mój tekst na widok nagłówka w widoku recyclinglerview, uczyniłem recyclinglerview bezpośrednim potomkiem układu koordynatora i usunąłem zagnieżdżony widok przewijania. Potem wszystkie moje problemy zniknęły.
źródło
RecyclerView
narzędziaNestedScrollingChild
,RecyclerView
powinny być możliwe do przewijaniaNestedScrollView
.Jeśli używasz
RecyclerView-23.2.1
lub później. Następujące rozwiązanie będzie działać dobrze:W swoim układzie dodaj RecyclerView w następujący sposób:
A w twoim pliku Java:
Tutaj
layoutManager.setAutoMeasureEnabled(true);
załatwi sprawę.Sprawdź ten problem i blog programisty, aby uzyskać więcej informacji.
źródło
Jednym z rozwiązań, które pozwala zachować funkcję recyklingu w widoku recyklera i uniknąć ładowania podglądu w celu załadowania wszystkich danych, jest ustawienie stałej wysokości w samym widoku recyklingu. W ten sposób widok recyklera ogranicza się tylko do załadowania takiej wysokości, jaką może pokazać użytkownik, a zatem recykling elementu, jeśli przewiniesz do dołu / góry.
źródło
Istnieje wiele dobrych odpowiedzi. Kluczem jest to, że trzeba ustawić
nestedScrollingEnabled
sięfalse
. Jak wspomniano powyżej, możesz to zrobić w kodzie Java:Ale masz również możliwość ustawienia tej samej właściwości w xml code (
android:nestedScrollingEnabled="false"
):źródło
Jeśli używasz RecyclerView ScrollListener wewnątrz NestedScrollView , detektor addOnScrollListener nie działa poprawnie, jeśli używasz obu z nich.
Użyj tego kodu.
ten kod działa dobrze RecyclerView ScrollListener wewnątrz NestedScrollView .
dzięki
źródło
Musiałem zaimplementować CoordinatorLayout z przewijaniem paska narzędzi i zajęło mi to cały dzień. Pracuję, usuwając w ogóle NestedScrollView. Więc używam RelativeLayout w katalogu głównym.
źródło
nie używaj recyclerView wewnątrz NestedScrollView. może powodować problemy kaskadowe! Sugeruję użycie ItemViewTypes w RecyclerView do obsługi wielu rodzajów widoków. wystarczy dodać RecyclerView o szerokości i wysokości match_parent. następnie w swoim recyclinglerViewAdapter zastąp parametr getItemViewType i użyj pozycji do obsługi układu, który ma zostać napompowany. potem możesz obsłużyć uchwyt widoku za pomocą metody onBindViewHolder.
źródło
źródło
Użyłem tego niesamowitego rozszerzenia (napisanego w Kotlin, ale może być również użyte w Javie)
https://github.com/Widgetlabs/expedition-nestedscrollview
Zasadniczo dostajesz
NestedRecyclerView
wnętrze każdego pakietu, powiedzmy utils w swoim projekcie, a następnie po prostu utwórz swój widok recykleraSprawdź ten niesamowity artykuł autorstwa Marc Knaup
https://medium.com/widgetlabs-engineering/scrollable-nestedscrollviews-inside-recyclerview-ca65050d828a
źródło
Korzyści:
Naprawić :
źródło
RecyclerView z NestedScrollView
źródło