如何在适配器中启动Activity?

76

我有一个带有自定义适配器的ListActivity,每个视图内都可能有一些按钮,我需要在其中实现OnClickListener。我需要在适配器中实现OnClickListener,但是我不知道如何调用像startActivity()setResult()这样的函数,因为适配器没有扩展到Activity。

那么解决这个问题的最佳方法是什么?

谢谢。

9个回答

204

只需将当前上下文传递给 Adapter 构造函数并将其存储为字段。然后在 onClick 内部,您可以使用该上下文调用 startActivity()。

伪代码

public class MyAdapter extends Adapter {
     private Context context;

     public MyAdapter(Context context) {
          this.context = context;     
     }

     public View getView(...){
         View v;
         v.setOnClickListener(new OnClickListener() {
             void onClick() {
                 context.startActivity(...);
             }
         });
     }
}

但是还有一个问题,如果我需要调用setResult怎么办?因为我需要在我的活动中调用onActivityResult(...)函数。谢谢你的帮助。 - justicepenny
1
如果你想从子活动返回一些结果,你需要使用startActivityForResult来启动活动,而不是StartActivity,并重写onActivityResult(在子活动结束后调用)。 - Robby Pond
1
@RobbyPond 上下文没有startActivityForResult()! http://developer.android.com/reference/android/content/Context.html - C--
3
你可以这样转换上下文:((Activity) context).startActivityForResult(intent, 0); - Xenione
有没有一种方法可以在当前活动中使用putExtra和Finish()? - harishannam

68

在实现 onClickListener 时,你可以使用 v.getContext.startActivity

btn.setOnClickListener(new OnClickListener() {                  
    @Override
    public void onClick(View v) {
        v.getContext().startActivity(PUT_YOUR_INTENT_HERE);
    }
});

1
但是还有一个问题,如果我需要调用setResult怎么办?因为我需要在我的活动中调用onActivityResult(...)函数。感谢您的帮助。 - justicepenny

32
public class MyAdapter extends Adapter {
     private Context context;      


     public MyAdapter(Context context) {
          this.context = context;         
     }


     public View getView(...){  
         View v;  
         v.setOnClickListener(new OnClickListener() {
             void onClick() {
                  Intent intent= new Intent(context, ToActivity.class); 
                   intent.putExtra("your_extra","your_class_value");
                 context.startActivity(intent);
             }
         });
     }
}

1
一个老线程,但是为了新的搜索结果而添加:适配器中的回调违反了设计模式,因为意图应该在活动内创建和执行,监听器最适合这种用例。 - DevKRos

14

对于较新版本的sdk,您需要设置活动任务标志。

public void onClick(View v)
 {
     Intent myactivity = new Intent(context.getApplicationContext(), OtherActivity.class);
     myactivity.addFlags(FLAG_ACTIVITY_NEW_TASK);
     context.getApplicationContext().startActivity(myactivity);
 }

1
这是真正的答案,原因是:context.getApplicationContext().startActivity(myactivity); 如果你只使用 context.startActivity(intent),它不会起作用!对于 Android 上的 Kotlin,只需以这种方式解决问题。 - Ramiro G.M.

4
在Adopter的按钮onClickListener中启动活动的简单方法:
Intent myIntent = new Intent(view.getContext(),Event_Member_list.class);                    myIntent.putExtra("intVariableName", eventsList.get(position).getEvent_id());
                view.getContext().startActivity(myIntent);

2
view.getContext().startActivity(intent);

视图 - public void onClick(View view) 图片的 OnClick


2

适配器向活动回调可以通过以接口形式注册侦听器来完成: 创建一个接口:

      public MyInterface{
         public void  yourmethod(//incase needs parameters );
         }

在适配器中,假设我的适配器是MyAdapter:
    public MyAdapter extends BaseAdapter{
       private MyInterface listener;

    MyAdapter(Context context){
        try {
            this. listener = (( MyInterface ) context);
              } catch (ClassCastException e) {
               throw new ClassCastException("Activity must implement MyInterface");
          }

//在需要触发监听器的位置执行此操作 l

          try {
                listener . yourmethod ();
            } catch (ClassCastException exception) {
               // do something
            }

      In Activity Implement your method:


         MyActivity extends AppCompatActivity implements MyInterface{

                yourmethod(){
                //do whatever you want
                     }
                     }

1

第一解决方案:

您可以在适配器中像这样调用启动活动:

public class YourAdapter extends Adapter {
     private Context context;

     public YourAdapter(Context context) {
          this.context = context;     
     }

     public View getView(...){
         View v;
         v.setOnClickListener(new OnClickListener() {
             void onClick() {
                 context.startActivity(...);
             }
         });
     }
}

第二种解决方案:

您可以在YourAdapter类之外调用您的按钮的onClickListener。按照以下步骤进行操作:

创建一个如下所示的接口:

public YourInterface{
         public void  yourMethod(args...);
}

然后在您的适配器内部:

    public YourAdapter extends BaseAdapter{
               private YourInterface listener;

           public YourAdapter (Context context, YourInterface listener){
                    this.listener = listener;
                    this.context = context;
           }

           public View getView(...){
                View v;
         v.setOnClickListener(new OnClickListener() {
             void onClick() {
                 listener.yourMethod(args);
             }
         });
}

你需要在以下位置初始化你的适配器:

YourAdapter adapter = new YourAdapter(getContext(), (args) -> {
            startActivity(...);
        });

这个 链接 可能对你有用。

0
如果您想要从适配器类中重定向到URL而不是活动,则需要使用startactivity的上下文。
btnInstall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(Intent.ACTION_VIEW, Uri.parse(link));
                intent.setData(Uri.parse(link));
                context.startActivity(intent);
            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接