Вызов метода активности из адаптера
можно ли вызвать метод, который определен в 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 } };