从适配器调用活动方法

是否可以调用在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 } 

这个条件将使你能够执行一些事情,如果具有从你的adaptergetView()方法请求视图的GroupView的Activity是你的yourActivity

注: parent是该GroupView