Intereting Posts
ListView: setItemChecked работает только со стандартным ArrayAdapter – НЕ работает при использовании настраиваемого ArrayAdapter? Ошибка раздувания класса android.support.v7.widget.CardView Почему я хочу избегать конструкторов не по умолчанию в фрагментах? Как сохранить ImageView как изображение? NullPointerException при включении перетаскивания-list-listview из OnItemLongClickListener в виде списка Воссоздание объекта камеры после ошибки 100 (сервер камеры скончался) Приостановить фоновый процесс в robospice Получить данные из уведомления GCM Что такое JNI Graphics или как ее использовать? Измените часть цвета текста внутри виджета «EditText» Как динамически обновлять определенный overlayitem Java сортирует массив месяцев в несколько массивов по месяцам Как прокручивать до центра HorizontalScrollView только при запуске активности? Аутентификация с устройства Android против Spring Security Rest API Как использовать новую библиотеку привязки данных Android для заполнения дочерних элементов LinearLayout на основе коллекции?

Вызов метода активности из адаптера

Можно ли вызвать mathod, который определен в Activity из ListAdapter ?

(Я хочу сделать Button в строке list's и когда эта кнопка будет нажата, она должна выполнить метод, определенный в текущей Activity. Я попытался установить onClickListener в моем ListAdapter но я не знаю, как вызвать этот метод, что Его путь …)

Когда я использовал Activity.this.method() я получаю следующую ошибку:

 No enclosing instance of the type Activity is accessible in scope 

Есть идеи ?

Solutions Collecting From Web of "Вызов метода активности из адаптера"

Да, ты можешь.

В адаптере Добавить новое поле:

 private Context mContext; 

В конструкторе адаптера добавьте следующий код:

 public AdapterName(......,Context context){ //your code. this.mContext=context; } 

В getView (…) адаптера:

 Button btn=(Button)convertView.findViewById(yourButtonId); btn.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { if(mContext instanceof YourActivityName){ ((YourActivityName)mContext).yourDesiredMethod(); } } }); 

Замените свои собственные имена классов, где вы видите свой код, свою активность и т. Д.

Если вам нужно использовать этот же адаптер для нескольких операций, выполните следующие действия:

Создание интерфейса

 public interface IMethodCaller{ void yourDesiredMethod(); } 

Внедрите этот интерфейс в действия, необходимые для использования этого метода.

Затем в Adapter getView () вызовите:

 Button btn=(Button)convertView.findViewById(yourButtonId); btn.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { if(mContext instanceof IMethodCaller){ ((IMethodCaller)mContext).yourDesiredMethod(); } } }); 

Вы сделали. Если вам нужно использовать этот адаптер для действий, которые не требуют этого механизма вызова, код не будет выполняться (если проверка не выполняется).

Вы можете сделать это следующим образом:

Объявить интерфейс:

 public interface MyInterface{ public void foo(); } 

Позвольте вашей деятельности изобразить это:

 public class MyActivity extends Activity implements MyInterface{ public void foo(){ //do stuff } } 

Затем передайте свою активность в ListAdater:

 public MyAdapter extends BaseAdater{ private MyInterface listener; public MyAdapter(MyInterface listener){ this.listener = listener; } } 

И где-то в адаптере, когда вам нужно вызвать этот метод Activity:

 listener.foo(); 

Оригинал:

Я понимаю текущий ответ, но мне нужен более ясный пример. Вот пример того, что я использовал с Adapter (RecyclerView.Adapter) и Activity .

В вашей деятельности:

Это обеспечит interface который у нас есть в нашем Adapter . В этом примере он будет вызываться, когда пользователь нажимает на элемент в RecyclerView .

 public class MyActivity extends Activity implements AdapterCallback { private MyAdapter mMyAdapter; @Override public void onMethodCallback() { // do something } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.mMyAdapter = new MyAdapter(this); } } 

В вашем адаптере:

В Activity мы инициировали наш Adapter и передали его как аргумент конструктору. Это запустит наш interface для нашего метода обратного вызова. Вы можете видеть, что мы используем наш метод обратного вызова для пользовательских кликов.

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private AdapterCallback mAdapterCallback; public MyAdapter(Context context) { try { this.mAdapterCallback = ((AdapterCallback) context); } catch (ClassCastException e) { throw new ClassCastException("Activity must implement AdapterCallback."); } } @Override public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) { // simple example, call interface here // not complete viewHolder.itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { mAdapterCallback.onMethodCallback(); } catch (ClassCastException exception) { // do something } } }); } public static interface AdapterCallback { void onMethodCallback(); } } 

Базовый и простой.

В вашем адаптере просто используйте это.

((YourParentClass)) .functionToRun ();

Еще один способ:

Напишите способ в вашем адаптере, если хотите сказать public void callBack () {}.

Теперь при создании объекта для адаптера в активности переопределите этот метод. Метод переадресации вызывается при вызове метода в адаптере.

  Myadapter adapter = new Myadapter(){ @override public void callBack(){ // dosomething } }; 
 if(parent.getContext() instanceof yourActivity){ //execute code } 

Это условие позволит вам что-то выполнить, если в Activity, у которого есть GroupView , запрашивающий представления из getView() вашего adapter является yourActivity

ПРИМЕЧАНИЕ. parent – это GroupView