Próbuję zaimplementować układ zawierający RecyclerView i ScrollView w tym samym układzie.
Szablon układu:
<RelativeLayout>
<ScrollView android:id="@+id/myScrollView">
<unrelated data>...</unrealated data>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_recycler_view"
/>
</ScrollView>
</RelativeLayout>
Problemy: mogę przewijać do ostatniego elementu ScrollView
Rzeczy, których próbowałem:
- widok karty w
ScrollView
(terazScrollView
zawieraRecyclerView
) - widzi kartę aż doRecyclerView
- początkową myślą było zaimplementowanie tego
viewGroup
za pomocąRecyclerView
zamiast tego,ScrollView
gdzie jednym z jego typów widoków jest,CardView
ale uzyskałem dokładnie takie same wyniki jak w przypadkuScrollView
NestedScrollView
, ponieważ obsługuje wiele problemów z przewijaniemNestedScrollView
zamiast zamiastScrollView
. Właśnie po to jest.Odpowiedzi:
użyj
NestedScrollView
zamiastScrollView
Proszę przejść dokumencie referencyjnym NestedScrollView aby uzyskać więcej informacji.
i dodaj
recyclerView.setNestedScrollingEnabled(false);
do swojegoRecyclerView
źródło
android:layout_height="wrap_content"
zawyżony układ dla ViewHolderNestedScrollView
dla mnie opóźniony, w przeciwieństwie doScrollView
. Poszukiwanie rozwiązania bez użyciaNestedScrollView
Wiem, że spóźniłem się z grą, ale problem nadal występuje, nawet jeśli google naprawiło
android.support.v7.widget.RecyclerView
Problem mam teraz jest
RecyclerView
zlayout_height=wrap_content
nie biorąc wysokość wszystkich kwestii pozycji wewnątrzScrollView
że tylko dzieje się na wersjach prawoślazu i nugat + (API 23, 24, 25).(UPDATE: Wymiana
ScrollView
zandroid.support.v4.widget.NestedScrollView
działa na wszystkich wersjach jakoś brakowało testowania. Przyjętego rozwiązania dodanych w tym w moim projekcie github jako demo.).Po wypróbowaniu różnych rzeczy znalazłem obejście, które rozwiązuje ten problem.
Oto moja struktura układu w pigułce:
Rozwiązaniem jest Owiń
RecyclerView
sięRelativeLayout
. Nie pytaj mnie, jak znalazłem to obejście !!!¯\_(ツ)_/¯
Pełny przykład jest dostępny w projekcie GitHub - https://github.com/amardeshbd/android-recycler-view-wrap-content
Oto zrzut ekranu pokazowy pokazujący poprawkę w akcji:
źródło
Chociaż zalecenie to
To dobra rada, jednak jeśli ustawisz stałą wysokość w widoku urządzenia do recyklingu, powinno działać dobrze.
Jeśli znasz wysokość układu elementu adaptera, możesz po prostu obliczyć wysokość RecyclerView.
źródło
adapterItemSize
zmienna?W przypadku, gdy ustawienie stałej wysokości dla RecyclerView nie działało dla kogoś (takiego jak ja), oto co dodałem do rozwiązania o stałej wysokości:
źródło
Nowa Android Support Library 23.2 rozwiązuje ten problem, możesz teraz ustawić wrap_content jako wysokość swojego
RecyclerView
i działa poprawnie.Biblioteka obsługi Androida 23.2
źródło
RecyclerViews można umieszczać w ScrollViews, o ile same się nie przewijają. W takim przypadku sensowne jest ustawienie stałej wysokości.
Właściwym rozwiązaniem jest użycie
wrap_content
na wysokości RecyclerView, a następnie zaimplementowanie niestandardowego LinearLayoutManager, który może poprawnie obsługiwać zawijanie.Skopiuj ten LinearLayoutManager do swojego projektu: https://github.com/serso/android-linear-layout-manager/blob/master/lib/src/main/java/org/solovyev/android/views/llm/LinearLayoutManager.java
Następnie zawiń RecyclerView:
I skonfiguruj tak:
Edycja: Może to powodować komplikacje podczas przewijania, ponieważ RecyclerView może ukraść zdarzenia dotykowe ScrollView. Moim rozwiązaniem było po prostu porzucić RecyclerView i przejść z LinearLayout, programowo zawęzić podview i dodać je do układu.
źródło
Dla
ScrollView
, można użyćfillViewport=true
i zrobićlayout_height="match_parent"
jak poniżej i umieścić recykler widok wewnątrz:Kod nie wymaga dalszej regulacji wysokości.
źródło
RecyclerView
Ręczne obliczanie wysokości nie jest dobre, lepiej jest użyć niestandardowegoLayoutManager
.Powodem powyższego problemu jest każdy widok, który ma swój przewijania (
ListView
,GridView
,RecyclerView
) udało się obliczyć wysokość, gdy jest to dodatek jako dziecko w innym widoku ma zwój. Przesłonięcie tejonMeasure
metody rozwiąże problem.Zastąp domyślnego menedżera układu poniższym:
źródło
Spróbuj tego. Bardzo późna odpowiedź. Ale na pewno pomóż każdemu w przyszłości.
Ustaw Scrollview na NestedScrollView
W twoim Recyclerview
źródło
AKTUALIZACJA: ta odpowiedź jest nieaktualna, ponieważ istnieją widżety takie jak NestedScrollView i RecyclerView, które obsługują przewijanie zagnieżdżone.
nigdy nie należy umieszczać przewijanego widoku w innym przewijalnym widoku!
Proponuję zrobić widok głównego układu recyklingu i umieścić swoje widoki jako elementy widoku układu recyklingu.
spójrz na ten przykład, który pokazuje, jak używać wielu widoków wewnątrz adaptera widoku recyklera. link do przykładu
źródło
Jeśli umieścisz
RecyclerView
wewnątrzNestedScrollView
i umożliwiająrecyclerView.setNestedScrollingEnabled(false);
przewijanie będzie działa dobrze .Istnieje jednak problem
Na przykład twój
RecyclerView
(wewnątrzNestedScrollView
lubScrollView
) ma 100 pozycji.Po
Activity
uruchomieniu utworzy się 100 przedmiotów (onCreateViewHolder
ionBindViewHolder
100 przedmiotów zostanie wywołanych w tym samym czasie).Przykład: dla każdego elementu załadujesz duży obraz z API => utworzone działanie - załaduje się> 100 obrazów.
Powoduje spowolnienie i opóźnienie rozpoczęcia działania.
Możliwe rozwiązanie :
- Myślenie o korzystaniu
RecyclerView
z wielu typów.Jednakże, jeśli w Twoim przypadku, istnieje tylko kilka artykuł
RecyclerView
i recyklingu lub nie recycle nie wpływa na wydajność dużo, można użyćRecyclerView
środkaScrollView
do prostychźródło
RecyclerView
recyklingu po włożeniuScrollView
. Jeśli chcesz poddać recyklingowi, pomyśl o innym podejściu (np. Użyciu RecyclerView z wieloma typami)Możesz użyć tej metody:
Dodaj ten wiersz do swojego recyklera Wyświetl widok xml:
spróbuj, widok recyklera będzie płynnie przewijany z elastyczną wysokością
mam nadzieję, że to pomogło.
źródło
Wydaje się, że
NestedScrollView
to rozwiązuje problem. Testowałem przy użyciu tego układu:I działa bez problemów
źródło
Użyłem CustomLayoutManager, aby wyłączyć przewijanie RecyclerView. Nie używaj również Recycler View jako WrapContent, użyj go jako 0dp, waga = 1
Użyj CustomLayoutManager w RecyclerView:
XML interfejsu użytkownika:
źródło
Miałem ten sam problem. Właśnie tego próbowałem i działa. Udostępniam mój kod XML i Java. Mam nadzieję, że to komuś pomoże.
Oto xml
Oto powiązany kod Java. To działa jak urok.
źródło
NestedScrollView
zamiast przewijania widokuTo załatwia sprawę:
źródło
W rzeczywistości głównym celem
RecyclerView
jest kompensacjaListView
iScrollView
. Zamiast robić to, co faktycznie robisz: mającRecyclerView
w domuScrollView
, sugerowałbym posiadanie tylko takiego,RecyclerView
który poradziłby sobie z wieloma typami dzieci.źródło
Najpierw powinieneś użyć
NestedScrollView
zamiastScrollView
i umieścićRecyclerView
wnętrzeNestedScrollView
.Użyj niestandardowej klasy układu, aby zmierzyć wysokość i szerokość ekranu:
I zaimplementuj poniższy kod w działaniu / fragmencie
RecyclerView
:źródło
Jeśli RecyclerView pokazuje tylko jeden wiersz w ScrollView. Musisz tylko ustawić wysokość swojego rzędu na
android:layout_height="wrap_content"
.źródło
możesz również zastąpić LinearLayoutManager, aby przeglądanie recyklera przebiegało płynnie
źródło
Przepraszam za spóźnienie na imprezę, ale wygląda na to, że istnieje inne rozwiązanie, które działa idealnie w przypadku, o którym wspomniałeś.
Jeśli używasz widoku recyklera w widoku recyklingu, wydaje się, że działa on idealnie. Osobiście próbowałem i użyłem go, i wydaje się, że nie powoduje to powolności ani szarpnięcia. Teraz nie jestem pewien, czy jest to dobra praktyka, czy nie, ale zagnieżdżanie wielu widoków recyklera, nawet zagnieżdżony widok przewijania spowalnia. Ale to wydaje się działać dobrze. Spróbuj. Jestem pewien, że zagnieżdżanie będzie w tym doskonale pasować.
źródło
Innym podejściem do rozwiązania tego problemu jest użycie
ConstraintLayout
wewnątrzScrollView
:Ale nadal
androidx.core.widget.NestedScrollView
trzymałbym się podejścia zaproponowanego przez Yang Peiyong .źródło
** Rozwiązanie, które działało dla mnie
Użyj NestedScrollView o wysokości jako wrap_content
// Twoja treść wiersza idzie tutaj
źródło