2016-09-06 16 views
7

Mam dwa RecyclerView.Adapter s, które używają dokładnie takich samych RecyclerView.ViewHolder s jako klas wewnętrznych.Czy RecyclerView.ViewHolder zawsze musi być wewnętrzną klasą?

Chciałem pozbyć się powielania kodu i uczynić te ViewHolder s darmową, oddzielną klasą, dzięki czemu zupełnie nowa klasa może być teraz używana przez dowolne RecyclerView.Adapter s.

Jednak napotkałem wiele problemów, na przykład trudności w uzyskiwaniu dostępu do obiektów adaptera. getAdapterPosition() zawsze zwraca -1.

Więc zmieniłem zdanie i stworzyłem klasę super RecyclerView.Adapter, która jest rozszerzona o te adaptery i umieszcza ViewHolder w superklasie, aby te adaptery mogły używać jej z podklasy.

Ale chcę wiedzieć, czy ViewHolder musi być wewnętrzną klasą. To mnie denerwuje. Proszę mi doradzić NIE łączyć klasy adapter, one są zupełnie inne jak ViewHolder jest tylko specjalny viewType, które mogą być wyświetlane w dowolnej RecyclerView

Czekam na swoich lepszych rozwiązań, które sprawiają, że czuję się lepiej.

Pozdrawiam.

+1

Java nie ma nawet prawdziwych klas wewnętrznych, tylko trochę cukru syntaktycznego do pisania klas tego samego pakietu w tym samym pliku .java. Jeśli masz problemy z ViewHolders jako nie-wewnętrzne klasy, opublikuj problematyczny kod. – laalto

Odpowiedz

3

ViewHolder może być poza klasą. Klasa wewnętrzna jest tylko propozycją we wszystkich samouczkach dla RecyclerView, jest to lepszy sposób, jeśli Twój ViewHolder powinien mieć dostęp do wszystkich parametrów Adaptera, nawet tych prywatnych, ale jakikolwiek dostęp lub relacje z obiektami można odtworzyć za pomocą metod dostępu w Adapter i ViewHolder.

Stworzyłem samodzielny projekt z wykorzystaniem ViewHolder jako klasy zewnętrznej, spójrz. Link do repozytorium - https://github.com/maciejsikora/outsideviewholder.

Myślę, że również przyczyną twojego problemu jest fakt, że w pierwszej wersji kodu ViewHolder był klasą wewnętrzną i miał dostęp do właściwości, po zmianie na klasę zewnętrzną, kod powinien zostać refaktoryzowany, aw wynik wszystkie relacje między ViewHolder i Adapter powinny być dokładnie sprawdzone.

Odpowiedź na pytanie brzmi: - ViewHolder nie musi być wewnętrzną klasą, a twoje problemy są spowodowane nieprawidłową implementacją kodu w użyciu ViewHolder jako zewnętrznej klasy.

+0

Istnieje przycisk w moim viewHolder realizacji OnClickListener. Po wywołaniu detektora potrzebuję kliknięcia przycisku tego obiektu, więc muszę uzyskać dostęp do położenia adaptera. Jednak wywołanie metody getAdapterPosition() zwróciło wartość -1, więc spowodowałem awarię wyjątku IndexOutOfBounds, prawdopodobnie otrzymasz także -1 w swoim projekcie. :) –

+0

@ EgemenHamutçu nie jestem pewien. Aby uzyskać dostęp do pozycji, utwórz getter w adapterze i ustaw adapter na ViewHolder. –

0

Zawsze używałem tego jako wewnętrznego. Rozumiem twój problem i poradziłem sobie z nim przez jakiś czas i myślę, że ten post ma na to odpowiedź. Facet z tej odpowiedzi miał również problemy z adapterami.

Sprawdź to tutaj: https://stackoverflow.com/a/29719632/6634292

Twoje pytanie jest ciekawe pytanie;)

4

Właściwie nr.

Najpierw musisz zrozumieć, dlaczego potrzebujemy klasy wewnętrznej?

Potrzebujemy klas wewnętrznych, w których chcemy, aby tylko konkretna klasa miała tę funkcjonalność. Podobnie jak wiele klas wewnętrznych dla wielu Listeners i Button onClick i wiele innych.

Używamy wewnętrznej klasy dla , dzięki czemu rzeczy prywatne, krótkie i proste.

Możesz uczynić tę rzecz (ViewHolder) oddzielną klasą. Ale to nie będzie wydajne, jasne (jeśli utworzysz kolejną klasę, doda ona dodatkową klasę do twojego projektu) i skuteczny sposób.

+0

Zajęcia wewnętrzne są również "dodatkowymi zajęciami". – laalto

+0

Tak. Ale pomagają nam pisać czysty kod. –

+0

Klasy wewnętrzne są w rzeczywistości bardzo złą praktyką, ponieważ są "ukryte" w projekcie. Jest znacznie "czystszy" i zaleca się stosowanie zasady "jedna klasa na plik". – breakline

Powiązane problemy