Ja zastępując Moje strony ListView
z RecyclerView
lista pokazano OK, ale chciałbym wiedzieć, jak uzyskać klikniętego elementu i jego pozycję, podobnie jak w metodzie OnItemClickListener.onItemClick(AdapterView parent, View v, int position, long id)
używamy w ListView
.
Dzięki za pomysły!
Odpowiedzi:
Na podstawie linku: Dlaczego RecyclerView nie ma onItemClickListener ()? i czym różni się RecyclerView od Listview? , a także ogólny pomysł @ Duncana, podaję tutaj moje rozwiązanie:
Zdefiniuj jeden interfejs
RecyclerViewClickListener
do przekazywania wiadomości z adaptera doActivity
/Fragment
:W
Activity
/Fragment
zaimplementuj interfejs, a także przekaż odbiornik do adaptera:W
Adapter
iViewHolder
:Po przetestowaniu działa dobrze.
[ AKTUALIZACJA ]
Od API 22
RecyclerView.ViewHoler.getPosition()
jest przestarzałe, więc zamiast tego zgetLayoutPosition()
.źródło
private static RecyclerViewClickListener itemListener;
w konstruktorze.onBindViewHolder
. Co więcej, nie wszystkie moje pozycje na liście były klikalne (tylko część pozycji).new MyRecyclerViewAdapter(context, this)
? Może to spowodować wycieki pamięcipublic void recyclerViewListClicked(View v, int position);
Modyfikatorpublic
jest zbędny dla metod interfejsuźródło
Oto przykład ustawiania detektora kliknięć.
źródło
int position = getAdapterPosition();
Umieść ten kod w miejscu, w którym definiujesz widok recyklera w działaniu.
Następnie utwórz osobną klasę i umieść ten kod:
źródło
utwórz plik java z poniższym kodem
i po prostu użyj detektora w swoim obiekcie RecyclerView.
źródło
RecyclerItemClickListener
nie jest domyślną klasą systemu Android, należy podać używaną bibliotekę lub samą klasę.Jeśli chcesz zdarzenie Kliknij, aby odtworzyć widok z działania / fragmentu zamiast adaptera, możesz również skorzystać z następującego skrótu.
Możesz także użyć innych długich sposobów, takich jak korzystanie z interfejsu
źródło
źródło
Użyj poniższego kodu: -
źródło
RecyclerView nie zapewnia takiej metody.
Aby zarządzać zdarzeniami kliknięć w RecyclerView, skończyło się na implementacji onClickListener w moim adapterze, podczas wiązania ViewHolder: w moim ViewHolder zachowuję odniesienie do widoku głównego (tak jak można to zrobić z obrazami ImageViews, TextViews itp ...) i podczas wiązania the viewHolder Ustawiłem na nim tag z informacjami potrzebnymi do obsługi kliknięcia (np. pozycja) i nasłuchiwaniem kliknięć
źródło
Ja też miałem ten sam problem.
Chciałem znaleźć pozycję klikniętego / wybranego elementu w RecyclerView () i wykonać określone operacje na tym konkretnym elemencie.
Metoda getAdapterPosition () działa jak urok dla tego typu rzeczy. Znalazłem tę metodę po całym dniu długich badań i po wypróbowaniu wielu innych metod.
Nie musisz używać żadnej dodatkowej metody. Po prostu utwórz zmienną globalną o nazwie „position” i zainicjalizuj ją za pomocą metody getAdapterPosition () w dowolnej z głównych metod adaptera (klasy lub podobnej).
Oto krótka dokumentacja z tego linku .
Chętnie pomoże. Zapraszam do zadawania wątpliwości.
źródło
Moje proste rozwiązanie
Po prostu umieść lub umieść dane, które chcesz uzyskać z aktywności.
Konstruktor adaptera:
W aktywności:
W adapterze onClickLictener w elemencie
w onBindViewHolder
Teraz za każdym razem, gdy zmieniasz pozycję w RecyclerView, jest on trzymany w Holderze (lub może powinien się nazywać Listener)
Mam nadzieję, że to się przyda
Mój pierwszy post; P
źródło
źródło
Spróbuj w ten sposób
Klasa adaptera:
}
W swojej aktywności lub fragmencie:
Uwaga: Zaimplementuj OnItemClickListener na podstawie kontekstu podanego przez Ciebie w działaniu lub fragmentach i metodach zastępczych.
źródło
Za każdym razem stosuję inne podejście. Wydaje się, że ludzie przechowują lub ustalają pozycję w widoku, zamiast przechowywać odniesienie do obiektu wyświetlanego przez ViewHolder.
Zamiast tego używam tego podejścia i po prostu przechowuję go w ViewHolder, gdy wywoływana jest onBindViewHolder (), i ustawiam odniesienie na null w onViewRecycled ().
Za każdym razem, gdy ViewHolder staje się niewidoczny, jest poddawany recyklingowi. Więc to nie wpływa na duże zużycie pamięci.
źródło
Krótkie rozszerzenie dla metody Kotlina
zwraca bezwzględną pozycję wszystkich pozycji (nie pozycję tylko widocznych pozycji).
I użycie
źródło
Użyj metody getLayoutPosition () w metodzie java interfejsu niestandardowego. Spowoduje to zwrócenie wybranej pozycji elementu, sprawdź szczegółowe informacje
https://becody.com/get-clicked-item-and-its-position-in-recyclerview/
źródło
Projektant może ustawić
onClick
właściwość listItem na metodę zdefiniowaną za pomocą jednego parametru. Mam przykładową metodę zdefiniowaną poniżej. Metoda getAdapterPosition poda indeks wybranego elementu listItem.Aby uzyskać informacje na temat konfigurowania RecyclerView, zapoznaj się z dokumentacją tutaj: https://developer.android.com/guide/topics/ui/layout/recyclerview
źródło
źródło
Po wielu próbach i błędach stwierdziłem, że jest na to bardzo łatwy sposób, czyli utworzenie interfejsu w klasie adaptera i zaimplementowanie tego fragmentarycznie, teraz pojawia się zwrot akcji, zainicjowałem model widoku wewnątrz mojej funkcji nadpisującej obecną w teraz możesz wysłać dane z tej funkcji do viemodela, a stamtąd w dowolne miejsce.
Nie wiem, czy ta metoda jest dobrą metodą kodowania, ale daj mi znać w komentarzu, a jeśli ktoś chce zobaczyć, daj mi znać w sekcji komentarzy, regularnie otwieram przepływ stackover.
źródło
Jeśli używasz Kotlin
źródło
W onViewHolder ustaw onClickListiner na dowolny widok i kliknięcie z boku użyj tego kodu:
Toast.makeText (Drawer_bar.this, "pozycja" + pozycja, Toast.LENGTH_SHORT) .show ();
Zastąp
Drawer_Bar
swoją nazwą aktywności.źródło