如何在适配器中启动 Activity?

Posted

技术标签:

【中文标题】如何在适配器中启动 Activity?【英文标题】:How to start Activity in adapter? 【发布时间】:2011-05-10 23:23:16 【问题描述】:

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

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

谢谢。

【问题讨论】:

【参考方案1】:

只需将当前 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(...);
             
         );
     

【讨论】:

还有一个问题,如果我需要调用 setResult 怎么办?因为我需要在我的活动中调用 onActivityResult(...) 函数。感谢您的帮助。 如果要从子Activity返回一些结果,需要用startActivityForResult而不是StartActivity启动Activity,并覆盖onActivityResult(子Activity结束后调用)。 @RobbyPond 上下文没有 startActivityForResult() ! developer.android.com/reference/android/content/Context.html 你可以这样转换上下文:((Activity) context).startActivityForResults(intent,0); 有没有办法 putExtra 和 Finish() 当前活动?【参考方案2】:

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

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

【讨论】:

还有一个问题,如果我需要调用 setResult 怎么办?因为我需要在我的活动中调用 onActivityResult(...) 函数。感谢您的帮助。【参考方案3】:
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);
             
         );
     

【讨论】:

一个旧线程,但添加了新的搜索结果:来自适配器的这个回调违背了设计模式,因为应该在活动侦听器中创建和执行 Intent,最适合这个用例。【参考方案4】:

从适配器到活动的回调可以通过以接口的形式注册监听器来完成: 制作接口:

      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
                     
                     

【讨论】:

【参考方案5】:

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

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

【讨论】:

这是真正的答案,因为: context.getApplicationContext().startActivity(myactivity);如果您单独使用 context.startActivity(intent) 它将不起作用!只需以这种方式为 android 上的 kotlin 解决问题【参考方案6】:

如果您想重定向 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);
            
        );

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

第一个解决方案:

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

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

这个link可能对你有用。

【讨论】:

【参考方案9】:
view.getContext().startActivity(intent);

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

【讨论】:

以上是关于如何在适配器中启动 Activity?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问适配器类中的 Activity 对象

如何在 Kotlin 中使用与 Activity 和 Fragment 相同的 RecyclerView 适配器?

如何将值从基本适配器传递到 Android 中的 Activity

如何从android中的自定义适配器调用Activity asynctask

Android 12.0 适配——应用启动动画

从适配器调用 Activity 方法