Czy można wywołać metodę zdefiniowaną w Activity
from ListAdapter
?
(Chcę zrobić wiersz Button
w list's
wierszu i po kliknięciu tego przycisku powinien wykonać metodę, która jest zdefiniowana w odpowiednim działaniu. Próbowałem ustawić onClickListener
w moim, ListAdapter
ale nie wiem, jak wywołać tę metodę, jaka jest jej ścieżka. ..)
kiedy użyłem Activity.this.method()
, otrzymuję następujący błąd:
No enclosing instance of the type Activity is accessible in scope
Dowolny pomysł ?
android
list
adapter
addressing
user1602687
źródło
źródło
Odpowiedzi:
Tak, możesz.
W adapterze Dodaj nowe pole:
W konstruktorze adaptera dodaj następujący kod:
W getView (...) adaptera:
zastąp własnymi nazwami klas, w których widzisz swój kod, aktywność itp.
Jeśli potrzebujesz użyć tego samego adaptera do więcej niż jednej czynności, to:
Utwórz interfejs
Zaimplementuj ten interfejs w działaniach, których potrzebujesz, aby mieć tę funkcję wywoływania metody.
Następnie w adapterze getView () wywołaj:
Skończyłeś. Jeśli potrzebujesz użyć tego adaptera do działań, które nie wymagają tego mechanizmu wywołującego, kod nie zostanie wykonany (jeśli sprawdzenie nie powiedzie się).
źródło
Możesz to zrobić w ten sposób:
Zadeklaruj interfejs:
Pozwól swojej aktywności to zrealizować:
Następnie przekaż swoją aktywność do ListAdater:
I gdzieś w adapterze, kiedy musisz wywołać tę metodę Activity:
źródło
Oryginalny:
Rozumiem obecną odpowiedź, ale potrzebowałem wyraźniejszego przykładu. Oto przykład tego, co użyłem z
Adapter
(RecyclerView.Adapter) i plikiemActivity
.W Twojej aktywności:
Spowoduje to wdrożenie tego
interface
, co mamy w naszymAdapter
. W tym przykładzie zostanie wywołana, gdy użytkownik kliknie element wRecyclerView
.W Twoim adapterze:
W
Activity
, zainicjowaliśmy naszAdapter
i przekazaliśmy to jako argument konstruktorowi. Spowoduje to zainicjowanie naszejinterface
metody wywołania zwrotnego. Możesz zobaczyć, że używamy naszej metody wywołania zwrotnego dla kliknięć użytkowników.źródło
EventBus
jak sugerowałeś?Podstawowe i proste.
W swoim adapterze po prostu użyj tego.
((YourParentClass) context).functionToRun();
źródło
Jeszcze jeden sposób:
Napisz metodę w swoim adapterze, powiedzmy public void callBack () {}.
Teraz podczas tworzenia obiektu dla adaptera w aktywności należy zastąpić tę metodę. Metoda Override zostanie wywołana po wywołaniu metody w adapterze.
źródło
Kotlin:
Wystarczy zadzwonić w adapterze
źródło
ten warunek umożliwi ci wykonanie czegoś, jeśli działanie, które ma
GroupView
żądające widoki zgetView()
twojej metody,adapter
toyourActivity
UWAGA:
parent
czy to GroupViewźródło
getView()
metodę ..... więc uzyskujemy kontekst tego GroupView i badamy go za pomocą powyższego warunkuW Kotlinie jest teraz bardziej przejrzysty sposób dzięki wykorzystaniu funkcji lambda, bez konieczności stosowania interfejsów:
źródło