Как запустить активность в адаптере?

У меня есть ListActivity с моим настроенным адаптером, и внутри каждого представления у него могут быть несколько кнопок, в которых мне нужно реализовать OnClickListener. Мне нужно реализовать OnClickListener в адаптере. Однако я не знаю, как вызвать функцию типа startActivity() или setResult(). Поскольку адаптер не распространяется на Activity.

Итак, как лучше всего решить эту проблему?

Спасибо.


person justicepenny    schedule 16.11.2010    source источник


Ответы (8)


Просто передайте текущий контекст конструктору адаптера и сохраните его как поле. Затем внутри 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(...);
             }
         });
     }
}
person Robby Pond    schedule 16.11.2010
comment
но еще один вопрос, а что если мне нужно вызвать setResult? потому что мне нужно вызвать функцию onActivityResult(...) в моей деятельности. Спасибо за вашу помощь. - person justicepenny; 16.11.2010
comment
Если вы хотите вернуть некоторый результат дочерней активности, вам нужно запустить ее с помощью startActivityForResult вместо StartActivity и переопределить onActivityResult (которая вызывается после завершения дочерней активности). - person Robby Pond; 24.11.2010
comment
@RobbyPond Context не имеет startActivityForResult() ! developer.android.com/reference/android/content/Context.html - person Subin Sebastian; 12.07.2012
comment
вы можете использовать такой контекст: ((Activity) context).startActivityForResults(intent,0); - person Xenione; 25.07.2012
comment
Есть ли способ поставить текущую активность putExtra и Finish()? - person harishannam; 16.07.2015

При реализации onClickListener вы можете использовать v.getContext.startActivity.

btn.setOnClickListener(new OnClickListener() {                  
    @Override
    public void onClick(View v) {
        v.getContext().startActivity(PUT_YOUR_INTENT_HERE);
    }
});
person ccheneson    schedule 16.11.2010
comment
но еще один вопрос, а что если мне нужно вызвать setResult? потому что мне нужно вызвать функцию onActivityResult(...) в моей деятельности. Спасибо за вашу помощь. - person justicepenny; 16.11.2010

Для более новых версий sdk вы должны установить задачу активности флага.

public void onClick(View v)
 {
     Intent myactivity = new Intent(context.getApplicationContext(), OtherActivity.class);
     myactivity.addFlags(FLAG_ACTIVITY_NEW_TASK);
     context.getApplicationContext().startActivity(myactivity);
 }
person Kamran    schedule 13.04.2017
comment
Это реальный ответ из-за: context.getApplicationContext().startActivity(myactivity); Если вы используете только context.startActivity(intent), это не сработает! Просто решите проблему таким образом для kotlin на Android - person Ramiro G.M.; 19.12.2019

обратный вызов от адаптера к активности может быть выполнен с помощью регистрации слушателя в форме интерфейса: Создайте интерфейс:

      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
                     }
                     }
person DevKRos    schedule 20.01.2017

Простой способ начать активность в кнопке Adopter onClickListener:

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

Первое решение:

Вы можете вызвать начальное действие внутри вашего адаптера следующим образом:

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

Эта ссылка может быть вам полезна. .

person Masoud Mokhtari    schedule 02.11.2019

Если вы хотите перенаправить на 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);
            }
        });
person Nimesh Patel    schedule 27.01.2019

person    schedule
comment
Старый поток, но добавление для новых результатов поиска: этот обратный вызов от адаптера идет против шаблона проектирования, поскольку намерения должны создаваться и выполняться в прослушивателях действий, которые лучше всего подходят для этого используемого случая. - person DevKRos; 20.01.2017