Czy ktoś za pomocą RecyclerView
znalazł sposób, aby ustawić onClickListener
elementy w RecyclerView
? Pomyślałem o ustawieniu detektora do każdego układu dla każdego elementu, ale wydaje mi się to zbyt wielkim kłopotem. Jestem pewien, że istnieje sposób, RecyclerView
aby nasłuchiwać tego onClick
wydarzenia, ale nie jestem w stanie tego rozgryźć.
java
android
android-recyclerview
onclick
onclicklistener
CurtJRees
źródło
źródło
Odpowiedzi:
Ponieważ interfejsy API uległy radykalnej zmianie, nie zaskoczyłoby mnie, gdybyś stworzył
OnClickListener
dla każdego elementu. Nie jest to jednak żaden problem. W swojej realizacjiRecyclerView.Adapter<MyViewHolder>
powinieneś mieć:onClick
Metoda:źródło
onClick()
, należące doOnClickListener
można dołączyć do DOWOLNEGO widoku. Całe pytanie tutaj brzmi: które! Spróbuj, metoda jest nie tylko identyfikowana przez nazwę, ale także przez klasę. Jeśli nie mówisz, że twój kod ma zostać dodany do adaptera, twoja odpowiedź tak naprawdę nie pomaga.Oto lepszy i mniej ściśle powiązany sposób na wdrożenie
OnClickListener
for aRecyclerView
.Fragment użycia:
RecyclerItemClickListener
realizacja:źródło
Robię to w ten sposób, bez zbędnych klas, detektorów itp. Prosty kod wewnątrz naszego adaptera. Szczególnie lepsze rozwiązanie dla longClick niż przedstawione wcześniej.
Następnie wewnątrz fragmentu lub aktywności, po prostu naciśnij:
źródło
Sprawdź podobne pytanie , komentarz @ CommonsWare prowadzi do tego linku , który implementuje
OnClickListener
interfejs wviewHolder
.Oto prosty przykład
ViewHolder
:Adapter
Wtedy wygląda to tak:źródło
ListView
Już problematyczne, jeśli trzeba było stworzyć listę bardziej skomplikowanych obiektów niż tylko prostych rzędach. Co zrobić, jeśli musisz obsługiwać różne zdarzenia w zależności od miejsca kliknięcia elementu w widoku listy? Masz przerąbane. Tutaj masz każdego słuchacza.getPosition()
jest przestarzałe, użyjgetAdapterPosition()
lubgetLayoutPosition()
zamiast tego.Na podstawie odpowiedzi Jacoba Tabaka (+1 dla niego) mogłem dodać słuchacza onLongClick:
Następnie możesz użyć tego w następujący sposób:
źródło
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
view.getId() == R.id.selection
To działało dla mnie. Dołącz
OnClickListener
doonBindView
. Naprawdę nie wiem, czy to wpłynie na wydajność, ale wydaje się, że działa dobrze z małym kodem.źródło
To było dla mnie tak trudne, aby mieć w działaniu nasłuchiwanie kliknięcia elementu, a także mieć nasłuchiwanie kliknięcia dla pojedynczego widoku elementu, który nie uruchomi się w nasłuchiwaniu kliknięcia elementu. Po przeanalizowaniu odpowiedzi Jacoba Tabaka szanuję jego odpowiedź za kliknięcie przedmiotu, jeśli nie zostaną przedstawione żadne inne działania dotykowe wewnątrz przedmiotu.
Mam niestandardowy
OnClickListener
interfejs, który ma zdarzenie kliknięcia elementu, które przechowuje widok klikniętego elementu i pozycję elementu z adaptera. Przedstawiam jego instancję w konstruktorze (lub może to być za pomocą settera) i dołączam do nasłuchiwania kliknięcia kontenera uchwytu widoku.Mam także inny odbiornik kliknięć w adapterze (może znajdować się w uchwycie widoku), który obsłuży bieżące kliknięcie widoku z kontenera.
W działaniu musisz zainicjować adapter, przekazując instancję pliku
OnItemClickListener
I mój ViewHolder
źródło
Właśnie tego potrzebowałem, na wypadek, gdyby ktoś uznał to za przydatne:
Źródło: http://blog.csdn.net/jwzhangjie/article/details/36868515
źródło
Mam ładne rozwiązanie
RecyclerView
„sonItemClickListener
dla przedmiotów i podpunktachKrok 1 - Utwórz interfejs
Krok 2 Następnie użyj go w
onBindViewHolder
metodzie adaptera w następujący sposóbKrok 3 - znajdź i skonfiguruj widok recyklera w działaniu lub fragmencie, w którym go używasz
Krok 4 - W końcu zaimplementuj interfejs w działaniu lub fragmencie, w którym korzystasz z widoku recyklera
źródło
Oto co zrobiłem. To rozwiązanie obsługuje zarówno elementy onClick, jak i onLongClick zarówno w elementach RecyclerView, jak i widokach, wewnątrz elementów RecyclerView (widoki wewnętrzne).
Oznaczam viewHolder w wybranych widokach:
I używam holder.getPosition (), aby pobrać pozycję w metodzie onClick () (onLongClick jest podobny):
Działa również wariant z getChildPosition. Pamiętaj, że w widokach wewnętrznych w funkcji onClick () użyj:
Moim zdaniem zaletą tego rozwiązania jest to, że po kliknięciu obrazu wywoływany jest tylko detektor obrazu onclick (), podczas gdy połączyłem rozwiązanie Jacoba dla widoku elementu RecyclerView i moje rozwiązanie dla widoków wewnętrznych widok elementu RecyclerView po kliknięciu ( ) jest również nazywany (po kliknięciu obrazu).
źródło
Jest to o wiele łatwiejszy sposób. Po prostu zastosuj po kliknięciu w
onBindViewHolder
widoku katalogu głównego.Pomyśl, że to twój pogląd na adapter,
Następnie wykonaj następujące czynności w adapterze
źródło
Możesz przekazać
clickListener
doAdapter
.W twoim
Activity
:następnie przekaż to do
Adapter
:W
Adapter
„sonCreateViewHolder
:źródło
holder
wartości przez zamiar?Opracowałem lekką bibliotekę dla Androida, możesz odwiedzić https://github.com/ChathuraHettiarachchi/RecycleClick
i śledź następującą próbkę
źródło
Możesz zaimplementować OnClickListener do swojej klasy ViewHolder
I onBindViewHolder ustaw element posiadacza widoku
źródło
Zbyt proste i skuteczne.
Zamiast implementować interfejs
View.OnClickListener
wewnątrz uchwytu widoku lub tworzyć interfejs i implementować interfejs w twojej działalności - użyłem tego kodu do uproszczeniaOnClickListener
implementacji.źródło
Wszystkie dotychczas opublikowane odpowiedzi są świetnymi rozwiązaniami, jednak jeśli nie chcesz zajmować się zbyt wieloma szczegółami implementacji, a chcesz, aby działała podobnie do ListView, polecam użycie TwoWay-View, jak widać tutaj:
https://github.com/lucasr/twoway-view
Zauważ, że ta implementacja obsługuje również długie naciśnięcie na przedmioty, a także obsługę stanów naciśnięcia (co jest czymś ważnym, czego brakuje innym rozwiązaniom tego pytania).
Jeśli nie chcesz korzystać z całej biblioteki, spójrz na klasę ClickItemTouchListener , która w razie potrzeby może być używana jako samodzielna. Jedyny problem, jaki w tym momencie znalazłem, to długie naciśnięcie + przewijanie, wydaje się, że ma nieprawidłowe zachowanie.
źródło
Jeśli chcesz złapać zdarzenie kliknięcia na poszczególnych elementach, po prostu zaimplementuj je
OnClickListener
wViewHolder
klasie, a następnie ustaw detektory kliknięć na poszczególnych widokach lub całościitemView
.Poniższy przykład pokazuje to samo
źródło
Dla mnie to najlepszy sposób:
źródło
RecyclerView
Nie mająOnClickListener
i będą musiały wdrożyć go sami.Chciałbym dodać
OnItemClickListener
interfejsAdapter
zonClick
metodą wywoływaną po kliknięciu widoku elementu zViewHolder
. W związku z tym odpowiedzialność za zarządzanie kliknięciem elementu spoczywa pozaViewHolder
iAdapter
. Będzie aktywność lub fragment, który zadecyduje, co robićDodaj interfejs do obiektu nasłuchującego i obiektu nasłuchującego.
Przechwytujemy kliknięcie widoku głównego elementu i po wywołaniu wywołania zwrotnego wywołanie
onClick
nasłuchiwania na adapterze.Ponieważ aktywność lub fragment, fragment w naszym przypadku, przypisujemy odbiornik do adaptera, a wywołanie zwrotne onClick otrzymamy wybrany element według pozycji i otworzymy szczegółową aktywność elementu.
źródło
Niestety
RecyclerView
brakuje kilkuListView
wbudowanych funkcji. Na przykład możliwość dodaniaOnItemClickListener
wyzwalacza po kliknięciu elementu.RecyclerView
pozwala ustawićOnClickListener
w adapterze, ale przekazanie detektora kliknięć z kodu wywołującego, do adaptera i doViewHolder
, jest skomplikowane w przypadku przechwycenia prostego kliknięcia elementu.Musisz także zdefiniować
R.id.item_click_support
za pomocą ids.xml:Wynikowy detektor kliknięć kodu wygląda teraz tak:
W celu uzyskania krótkiego wyjaśnienia na temat kliknięć programu recyclinglerview zajrzyj na ten blog littlerobots_blog
źródło
możesz łatwo zdefiniować setOnClickListener w swojej klasie ViewHolder w następujący sposób:
źródło
Oto, co zrobiłem Czytaj więcej i pobierz tutaj treść
Dodanie tego samego tutaj
CustomItemClickListener.java
ItemsListAdapter.java
źródło
Z większości powyższych odpowiedzi wydaje się, że ustawiają swoich onklicklistenerów na poszczególnych elementach. Jednak rozwiązanie, które zamierzam zaoferować, jest bardzo proste, ale dla wielu nie jest intuicyjne. Wielu zapomina, że pozostałe komponenty są zawsze w komponencie nadrzędnym, który jest używany do wyświetlania elementów w widokach Listy lub Recyklera. To rozwiązanie polega tylko na ustawieniu pojedynczego detektora kliknięcia w tym widoku nadrzędnym i kolejka jest odtwarzana. Rozwiązanie obejmuje również sposób przekazania pozycji klikniętego elementu z widoku listy lub recyklera. Tutaj naszym głównym rootview jest CardView z biblioteki wsparcia Androida. Oto przykładowy kod
źródło
Kotlin realizacja nhaarman za odpowiedź :
RecyclerItemClickListener.java:
źródło
źródło
źródło
Możemy to zrobić, używając słabych referencji Java. Semantycznie uchwyt widoku to taki, który powinien odpowiadać na zdarzenie kliknięcia lub przekazać je właściwemu responderowi.
Nasze cele:
Kroki:
Utwórz interfejs do obsługi odpowiedzi na kliknięcia.
Zaimplementuj ten interfejs w działaniu, które obsłuży kliknięcie.
Dodaj zmienną składową w adapterze RecyclerView, aby przechowywać słabe odniesienie i konstruktor, który ją ustawia.
Zrób to samo w RecyclerView ViewHolder i dodaj zmienną składową, aby śledzić pozycję.
Ustaw detektory kliknięć w dowolnym widoku, który chcesz w ViewHolder, a następnie oddzwoń do odpowiadającego, aby je obsłużył.
Zmień metodę onBindViewHolder, aby ustawić pozycję podczas wiązania.
Przekaż obiekt odpowiadający w dół do ViewHolder.
W odpowiedzi możesz teraz użyć getId () w widoku, aby dowiedzieć się, który widok został kliknięty.
A oto Gist, dzięki czemu możesz zobaczyć, jak to wszystko do siebie pasuje: obsługa kliknięć RecyclerView
źródło
Zdaję sobie sprawę, że jest wiele odpowiedzi, ale pomyślałem, że mógłbym również przedstawić moją implementację. (Pełne informacje można znaleźć na inne pytanie, na które odpowiedziałem ).
Aby dodać detektor kliknięć,
ViewHolder
klasa wewnętrzna musi się zaimplementowaćView.OnClickListener
. To dlatego, że można ustawićOnClickListener
witemView
parametrzeViewHolder
„s konstruktora. Pokażę ci, co mam na myśli:Jedyne inne rzeczy, które musisz dodać, to niestandardowy interfejs dla Twojej
Adapter
i metody ustawiającej:Tak więc Twoja nowa obsługa kliknięć
Adapter
jest zakończona.Teraz użyjmy go ...
Jest to w zasadzie sposób skonfigurowania normalnego
Adapter
, z tą różnicą, że używasz utworzonej przez ciebie metody ustawiającej, aby kontrolować, co zrobisz, gdy użytkownik kliknie określoną pozycję na liście.Możesz także przejrzeć zestaw przykładów, które podałem w tej Gist na GitHub:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
źródło
To właśnie robię, aby ponownie wykorzystać
OnClickListener
w ViewHoder Weźmy element nadrzędny itemlayout
w onBindViewHolder ustaw znacznik jako pozycję
i w Onclick
źródło
Dla mnie czysty sposób to zrobić.
Konstruktor adapterów
Połączony interfejs
źródło