从适配器调用Activity方法

android list adapter

126081 观看

8回复

597 作者的声誉

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

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

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

No enclosing instance of the type Activity is accessible in scope

任何的想法 ?

作者: user1602687 的来源 发布者: 2012 年 8 月 27 日

回应 8


275

11219 作者的声誉

决定

是的你可以。

在适配器中添加一个新字段:

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

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

作者: Eldhose M Babu 发布者: 2012 年 8 月 27 日

111

10005 作者的声誉

你可以这样做:

声明接口:

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();
作者: Igor Filippov 发布者: 2012 年 8 月 27 日

54

40700 作者的声誉

原版的:

我理解当前的答案,但需要一个更清晰的例子。这是我使用Adapter(RecyclerView.Adapter)和一个例子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();
    }
}
作者: Jared Burrows 发布者: 2014 年 12 月 31 日

6

892 作者的声誉

还有一种方法是::

在你的适配器中写一个方法让我们说public void callBack(){}。

现在,为活动中的适配器创建对象时,会覆盖此方法。在适配器中调用方法时,将调用覆盖方法。

     Myadapter adapter = new Myadapter(){

                 @override
                 public void callBack(){
                    // dosomething
                 }
   };
作者: Prashanth Debbadwar 发布者: 2015 年 5 月 20 日

12

1652 作者的声誉

基本而简单。

在你的适配器中使用它。

((YourParentClass)context).functionToRun();

作者: Ck Maurya 发布者: 2015 年 12 月 28 日

0

16 作者的声誉

if(parent.getContext() instanceof yourActivity){
//execute code
}

如果具有GroupView请求getView()您的方法的视图的Activity,则此条件将允许您执行某些adapter操作yourActivity

注意:parent是GroupView

作者: Abd Salam Baker 发布者: 2017 年 5 月 26 日

1

762 作者的声誉

对于Kotlin:

在适配器中,只需调用即可

(context as Your_Activity_Name).your_method_name()
作者: Numair 发布者: 2018 年 7 月 1 日

0

61 作者的声誉

此解决方案适用于那些尝试在Adapter类中显示alertDialog的人

解:-

- 只需将显示对话框的功能移动到Activity类本身。

- 将该方法称为

 ((YourActivity)context).showDialogMethod();

-get活动上下文通过适配器构造函数。

作者: mohseen pathan 发布者: 2019 年 3 月 26 日
32x32