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

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

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

谢谢。

【问题讨论】:

    标签: java android android-activity adapter


    【解决方案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 图片。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-08-10
              • 1970-01-01
              • 1970-01-01
              • 2021-06-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多