Вызов метода активности из адаптера
можно ли вызвать метод, который определен в Activity С ListAdapter?
(Я хочу сделать Button на list's строка и когда эта кнопка нажата, она должна выполнить метод, который определен в соответствующей деятельности. Я пытался установить onClickListener в своем ListAdapter но я не знаю, как назвать этот метод, в чем его путь...)
когда я использовал Activity.this.method() Я получаю следующую ошибку:
No enclosing instance of the type Activity is accessible in scope
Есть Идеи ?
7 ответов:
Да, вы можете.
в адаптере добавить новое поле:
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(); }реализовать этот интерфейс в действиях, которые вы должны иметь эту функцию вызова метода.
затем в адаптере 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; } }и где-то в адаптере, когда вам нужно вызвать этот метод активности:
listener.foo();
Оригинал:
я понимаю текущий ответ, но нужен более четкий пример. Вот пример того, что я использовал с
Adapter(RecyclerView.Адаптер) и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(); } }
Basic и простой.
в вашем адаптере просто используйте это.
((YourParentClass) контексте).functionToRun ();
еще один способ::
написать метод в адаптере позволяет сказать общественного недействительными обратного вызова(){}.
теперь при создании объекта для адаптера в activity переопределите этот метод. Переопределение метод будет вызван при вызове метода в адаптере.
Myadapter adapter = new Myadapter(){ @override public void callBack(){ // dosomething } };