从适配器调用活动方法
是否可以调用在ListAdapter
Activity
定义的ListAdapter
?
(我想在list's
行中生成一个Button
,当这个button被点击时,它应该执行当前Activity中定义的方法。我尝试在ListAdapter
设置ListAdapter
但是我不知道如何调用这个方法,它的path…)
当我使用Activity.this.method()
我得到以下错误:
No enclosing instance of the type Activity is accessible in scope
任何想法 ?
是的你可以。
在适配器中添加一个新的字段:
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(); } } });
在你看到你的代码,活动等的地方replace你自己的类名
如果您需要为多个活动使用同一个适配器,则:
创build一个接口
public interface IMethodCaller{ void yourDesiredMethod(); }
在需要具有此方法调用function的活动中实现此接口。
然后在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
的例子。
在您的活动中:
这将实现我们在Adapter
中的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
并将其作为parameter passing给constructer。 这将启动我们的callback方法的interface
。 你可以看到我们使用我们的callback方法用户点击。
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(){}。
现在,在活动中为适配器创build对象时,将覆盖此方法。 当您在适配器中调用方法时,将会调用Override方法。
Myadapter adapter = new Myadapter(){ @override public void callBack(){ // dosomething } };
if(parent.getContext() instanceof yourActivity){ //execute code }
这个条件将使你能够执行一些事情,如果具有从你的adapter
的getView()
方法请求视图的GroupView
的Activity是你的yourActivity
注: parent
是该GroupView