为了账号安全,请及时绑定邮箱和手机立即绑定

从适配器调用活动方法

从适配器调用活动方法

杨__羊羊 2019-10-05 14:53:01
是否可以调用Activityfrom中定义的方法ListAdapter?(我想打一个Button在list's行单击此按钮时,它应该执行的方法,即在相应的活动定义。我试图设置onClickListener在我ListAdapter,但我不知道该怎么称呼这种方法,什么是它的路径。 ..)当我使用时Activity.this.method(),出现以下错误:No enclosing instance of the type Activity is accessible in scope任何想法 ?
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

是的你可以。


在适配器中添加新字段:


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();

        }

    }

});

大功告成 如果需要将此适配器用于不需要此调用机制的活动,则代码将不会执行(如果检查失败)。


查看完整回答
反对 回复 2019-10-05
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

原版的:

我了解当前答案,但需要一个更清晰的示例。这是我与Adapter(RecyclerView.Adapter)和一起使用的示例Activity。


在您的活动中:

这将实现interface我们在中拥有的Adapter。在此示例中,当用户单击中的项目时,将调用它RecyclerView。


public class MyActivity extends Activity implements AdapterCallback {


    private MyAdapter myAdapter;


    @Override

    public void onMethodCallback() {

       // do something

    }


    @Override

    protected void onCreate(@Nullable Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        myAdapter = new MyAdapter(this);

    }

}

在您的适配器中:

在中Activity,我们启动了我们的程序Adapter并将其作为参数传递给构造方法。这将启动我们interface的回调方法。您可以看到我们使用回调方法来实现用户点击。


public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {


    private AdapterCallback adapterCallback;


    public MyAdapter(Context context) {

        try {

            adapterCallback = ((AdapterCallback) context);

        } catch (ClassCastException e) {

            throw new ClassCastException("Activity must implement AdapterCallback.", e);

        }

    }


    @Override

    public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int position) {

        // simple example, call interface here

        // not complete

        viewHolder.itemView.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View view) {

                try {

                    adapterCallback.onMethodCallback();

                } catch (ClassCastException e) {

                   // do something

                }

            }

        });

    }


    public static interface AdapterCallback {

        void onMethodCallback();

    }

}


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 636 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信