Можно ли вызвать метод, определенный в Activity
from ListAdapter
?
(Я хочу создать Button
в list's
строке, и при нажатии этой кнопки он должен выполнить метод, определенный в соответствующем Activity. Я попытался установить onClickListener
в моем, ListAdapter
но я не знаю, как вызвать этот метод, каков его путь. ..)
при использовании Activity.this.method()
я получаю следующую ошибку:
No enclosing instance of the type Activity is accessible in scope
Любая идея ?
android
list
adapter
addressing
user1602687
источник
источник
Ответы:
Да, ты можешь.
В адаптере добавьте новое поле:
В конструктор адаптера добавьте следующий код:
В getView (...) адаптера:
замените на свои собственные имена классов, в которых вы видите свой код, свою активность и т. д.
Если вам нужно использовать один и тот же адаптер для нескольких действий, тогда:
Создать интерфейс
Реализуйте этот интерфейс в действиях, которые необходимы для использования этой функции вызова метода.
Затем в адаптере getView () вызовите так:
Вы сделали. Если вам нужно использовать этот адаптер для действий, которые не требуют этого механизма вызова, код не будет выполняться (если проверка не удалась).
источник
Сделать это можно так:
Объявить интерфейс:
Пусть ваша деятельность реализует это:
Затем передайте свою активность в ListAdater:
И где-то в адаптере, когда вам нужно вызвать этот метод Activity:
источник
Оригинал:
Я понимаю текущий ответ, но мне нужен более четкий пример. Вот пример того, что я использовал с
Adapter
(RecyclerView.Adapter) иActivity
.В вашей деятельности:
Это будет реализовывать то
interface
, что есть в нашемAdapter
. В этом примере он будет вызываться, когда пользователь щелкает элемент в файлеRecyclerView
.В вашем адаптере:
В
Activity
, мы инициировали нашAdapter
и передали это как аргумент конструктору. Это запуститinterface
наш метод обратного вызова. Вы можете видеть, что мы используем наш метод обратного вызова для пользовательских кликов.источник
EventBus
который вы предложили?Простой и простой.
В вашем адаптере просто используйте это.
((YourParentClass) context).functionToRun();
источник
Еще один способ:
Напишите метод в своем адаптере, скажем, public void callBack () {}.
Теперь при создании объекта для адаптера в действии переопределите этот метод. Метод переопределения будет вызван при вызове метода в адаптере.
источник
Для Котлина:
В вашем адаптере просто позвоните
источник
это условие позволит вам выполнить что-либо, если действие, которое имеет
GroupView
запрашивающие представления изgetView()
метода вашегоadapter
,yourActivity
ПРИМЕЧАНИЕ:
parent
это GroupViewисточник
getView()
метод ... так что мы получаем контекст этого GroupView и исследуем его с помощью условия вышеВ Kotlin теперь есть более чистый способ использования лямбда-функций, без интерфейсов:
источник