如何在适配器中启动Activity?

时间:2010-11-16 17:36:22

标签: java android android-activity adapter

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

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

9 个答案:

答案 0 :(得分:157)

只需将当前Context传递给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(...);
             }
         });
     }
}

答案 1 :(得分:47)

实施onClickListener时,您可以使用v.getContext.startActivity

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

答案 2 :(得分:28)

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, goto.class);
                   intent.putextra("your_extra","your_class_value");
                 context.startActivity(intent);
             }
         });
     }
}

答案 3 :(得分:10)

对于较新版本的sdk,您必须设置标记活动任务。

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

答案 4 :(得分:1)

从适配器到活动的回调可以使用以接口形式注册监听器来完成:  建立一个界面:

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

//在需要触发侦听器的地方执行此操作           升

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

      In Activity Implement your method:


         MyActivity extends AppCompatActivity implements MyInterface{

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

答案 5 :(得分: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(...);
             }
         });
     }
}

第二个解决方案:

您可以在onClickListener类中调用按钮的YourAdapter。请按照下列步骤操作:

创建这样的接口:

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

link对您可能有用。

答案 6 :(得分:0)

如果您要重定向网址而不是适配器类的活动,请使用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);
            }
        });

答案 7 :(得分:0)

在Adopter的按钮onClickListener中启动活动的简单方法:

Intent myIntent = new Intent(view.getContext(),Event_Member_list.class);                    myIntent.putExtra("intVariableName", eventsList.get(position).getEvent_id());
                view.getContext().startActivity(myIntent);

答案 8 :(得分:0)

view.getContext().startActivity(intent);

查看 - public void onClick(View view) OnClick 张图片。