Próbuję pracować z nowym RecyclerView
, ale nie mogłem znaleźć przykładu a RecyclerView
z różnymi typami wierszy / widoków kart, które są zawyżane.
Za pomocą ListView
nadpisuję getViewTypeCount
i getItemViewType
, aby obsługiwać różne typy wierszy.
Mam to zrobić w „stary” sposób, czy powinienem coś zrobić LayoutManager
? Zastanawiałem się, czy ktoś mógłby wskazać mi właściwy kierunek. Ponieważ mogę znaleźć przykłady tylko z jednym typem.
Chcę mieć listę nieco innych kart. A może powinienem po prostu użyć scrollView
z cardViews
wnętrzem ... zrobić to bez adaptera i recyclerView
?
Odpowiedzi:
Obsługa logiki wierszy / sekcji podobna do UITableView systemu iOS nie jest tak prosta w systemie Android, jak w systemie iOS, jednak w przypadku korzystania z RecyclerView - elastyczność tego, co możesz zrobić, jest znacznie większa.
Ostatecznie chodzi o to, jak dowiedzieć się, jaki typ widoku wyświetlasz w adapterze. Kiedy już to zrozumiesz, żeglowanie powinno być łatwe (nie do końca, ale przynajmniej to załatwisz).
Adapter udostępnia dwie metody, które należy ominąć:
Domyślna implementacja tej metody zawsze zwróci 0, co oznacza, że istnieje tylko 1 typ widoku. W twoim przypadku tak nie jest, więc będziesz musiał znaleźć sposób, aby stwierdzić, który wiersz odpowiada danemu typowi widoku. W przeciwieństwie do iOS, który zarządza tym za Ciebie za pomocą wierszy i sekcji, tutaj będziesz mieć tylko jeden indeks, na którym możesz polegać, i będziesz musiał wykorzystać swoje umiejętności programisty, aby wiedzieć, kiedy pozycja jest skorelowana z nagłówkiem sekcji, a kiedy jest skorelowana z normalny rząd.
I tak musisz zastąpić tę metodę, ale zwykle ludzie po prostu ignorują parametr viewType. Zgodnie z typem widoku musisz nadmuchać odpowiedni zasób układu i odpowiednio utworzyć uchwyt widoku. RecyclerView będzie obsługiwać recykling różnych typów widoków w sposób, który pozwala uniknąć kolizji różnych typów widoków.
Jeśli planujesz używać domyślnego LayoutManagera, takiego jak
LinearLayoutManager
, powinieneś być gotowy . Jeśli planujesz stworzyć własną implementację LayoutManager, będziesz musiał popracować trochę ciężej. Jedynym API, z którym naprawdę musisz pracować, jest to,findViewByPosition(int position)
które daje dany widok w określonej pozycji. Ponieważ prawdopodobnie będziesz chciał to ułożyć inaczej w zależności od typu tego widoku, masz kilka opcji:Zwykle, gdy używasz wzorca ViewHolder, ustawiasz etykietę widoku za pomocą uchwytu widoku. Możesz użyć tego w czasie wykonywania w menedżerze układu, aby dowiedzieć się, jakiego typu jest widok, dodając pole w uchwycie widoku, które to wyraża.
Ponieważ będziesz potrzebować funkcji, która określa, która pozycja odpowiada typowi widoku, równie dobrze możesz w jakiś sposób uczynić tę metodę globalnie dostępną (może pojedynczą klasą zarządzającą danymi?), A następnie możesz po prostu zapytać o tę samą metodę zgodnie z pozycja.
Oto przykładowy kod:
Oto próbka tego, jak powinny wyglądać te osoby posiadające widoki:
Oczywiście w tym przykładzie założono, że źródło danych (myData) zostało utworzone w sposób ułatwiający implementację adaptera w ten sposób. Jako przykład pokażę, jak skonstruowałbym źródło danych, które pokazuje listę nazwisk i nagłówek za każdym razem, gdy zmienia się pierwsza litera nazwiska (zakładając, że lista jest alfabetyczna) - podobnie jak w przypadku kontaktów lista wyglądałaby następująco:
Ten przykład ma na celu rozwiązanie dość konkretnego problemu, ale mam nadzieję, że daje to dobry przegląd sposobów obsługi różnych typów wierszy w recyklerze i pozwala na dokonanie niezbędnych dostosowań we własnym kodzie do własnych potrzeb.
źródło
names[i].substring(0, 1)
onCreateViewHolder
która pomoże nam stworzyć uchwyt widoku. Aby uzyskać więcej informacji, możesz sprawdzić mój udział: stackoverflow.com/questions/47245398/ ...Sztuczka polega na utworzeniu podklas ViewHolder, a następnie ich rzuceniu.
A następnie w czasie wykonywania zrób coś takiego:
Mam nadzieję, że to pomoże.
źródło
Według Gila świetna odpowiedź, którą rozwiązałem, zastępując getItemViewType, jak wyjaśnił Gil. Jego odpowiedź jest świetna i należy ją oznaczyć jako poprawną. W każdym razie dodaję kod, aby osiągnąć wynik:
W adapterze do recyklingu:
W ten sposób możesz ustawić dowolny niestandardowy układ dla dowolnego wiersza!
źródło
Jest to dość trudne, ale o wiele trudne, po prostu skopiuj poniższy kod i gotowe
cieszyć się !!!!
źródło
Możemy uzyskać wiele widoków na jednym RecyclerView od dołu: -
Zależności w Gradle, więc dodaj poniższy kod: -
RecyclerView w XML
Kod działania
Pierwszy XML
Drugi XML
Trzeci XML
Teraz czas na zrobienie adaptera, a to jest główne do pokazania różnych widoków -2 w tym samym widoku recyklera, więc sprawdź dokładnie ten kod: -
Możesz również sprawdzić to łącze, aby uzyskać więcej informacji.
źródło
Musisz zaimplementować
getItemViewType()
metodę wRecyclerView.Adapter
. DomyślnieonCreateViewHolder(ViewGroup parent, int viewType)
implementacjaviewType
tej metody zwraca0
. Po pierwsze, musisz zobaczyć typ przedmiotu na pozycji, aby wyświetlić recykling, a do tego musisz nadpisaćgetItemViewType()
metodę, w której możesz przejść,viewType
która zwróci twoją pozycję przedmiotu. Przykład kodu podano poniżejźródło
getItemViewType (int position) jest kluczem
Jak to zrobić ?
Możesz utworzyć
RecyclerView
z dowolną liczbą różnych widoków (ViewHolders). Ale dla lepszej czytelności weźmy przykładRecyclerView
z dwomaViewholders
.Zapamiętaj te 3 proste kroki, a będziesz gotowy do pracy.
getItemViewType(int position)
ViewType
onCreateViewHolder ()Populate Zobacz na podstawie itemViewType w
onBindViewHolder()
metodzieOto fragment kodu dla Ciebie
Kod GitHub:
Oto projekt, w którym zaimplementowałem RecyclerView z wieloma ViewHolders.
źródło
Możesz po prostu zwrócić ItemViewType i użyć go. Zobacz poniższy kod:
źródło
Możesz skorzystać z biblioteki: https://github.com/vivchar/RendererRecyclerViewAdapter
Dla każdego elementu należy zaimplementować ViewRenderer, ViewHolder, SomeModel:
ViewHolder - jest to prosty uchwyt widoku recyklera.
SomeModel - to Twój model z
ItemModel
interfejsemAby uzyskać więcej informacji, możesz zajrzeć do dokumentacji.
źródło
Możesz skorzystać z tej biblioteki:
https://github.com/kmfish/MultiTypeListViewAdapter (napisana przeze mnie)
Adapter konfiguracji:
Dla każdego elementu zamówienia:
źródło