猿问

从适配器调用活动方法

是否可以调用Activityfrom中定义的方法ListAdapter?


(我想打一个Button在list's行单击此按钮时,它应该执行的方法,即在相应的活动定义。我试图设置onClickListener在我ListAdapter,但我不知道该怎么称呼这种方法,什么是它的路径。 ..)


当我使用时Activity.this.method(),出现以下错误:


No enclosing instance of the type Activity is accessible in scope

任何想法 ?


杨__羊羊
浏览 638回答 3
3回答

慕尼黑5688855

是的你可以。在适配器中添加新字段: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();        }    }});大功告成 如果需要将此适配器用于不需要此调用机制的活动,则代码将不会执行(如果检查失败)。

子衿沉夜

原版的:我了解当前答案,但需要一个更清晰的示例。这是我与Adapter(RecyclerView.Adapter)和一起使用的示例Activity。在您的活动中:这将实现interface我们在中拥有的Adapter。在此示例中,当用户单击中的项目时,将调用它RecyclerView。public class MyActivity extends Activity implements AdapterCallback {&nbsp; &nbsp; private MyAdapter myAdapter;&nbsp; &nbsp; @Override&nbsp; &nbsp; public void onMethodCallback() {&nbsp; &nbsp; &nbsp; &nbsp;// do something&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected void onCreate(@Nullable Bundle savedInstanceState) {&nbsp; &nbsp; &nbsp; &nbsp; super.onCreate(savedInstanceState);&nbsp; &nbsp; &nbsp; &nbsp; myAdapter = new MyAdapter(this);&nbsp; &nbsp; }}在您的适配器中:在中Activity,我们启动了我们的程序Adapter并将其作为参数传递给构造方法。这将启动我们interface的回调方法。您可以看到我们使用回调方法来实现用户点击。public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {&nbsp; &nbsp; private AdapterCallback adapterCallback;&nbsp; &nbsp; public MyAdapter(Context context) {&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; adapterCallback = ((AdapterCallback) context);&nbsp; &nbsp; &nbsp; &nbsp; } catch (ClassCastException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new ClassCastException("Activity must implement AdapterCallback.", e);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int position) {&nbsp; &nbsp; &nbsp; &nbsp; // simple example, call interface here&nbsp; &nbsp; &nbsp; &nbsp; // not complete&nbsp; &nbsp; &nbsp; &nbsp; viewHolder.itemView.setOnClickListener(new OnClickListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onClick(View view) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; adapterCallback.onMethodCallback();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (ClassCastException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// do something&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }&nbsp; &nbsp; public static interface AdapterCallback {&nbsp; &nbsp; &nbsp; &nbsp; void onMethodCallback();&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Android
我要回答