it-swarm.com.ru

Как начать Активность в адаптере?

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

так как лучше решить эту проблему? Спасибо 

56
justicepenny

Просто передайте текущий контекст конструктору адаптера и сохраните его в виде поля. Затем внутри 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(...);
             }
         });
     }
}
153
Robby Pond

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

btn.setOnClickListener(new OnClickListener() {                  
    @Override
    public void onClick(View v) {
        v.getContext().startActivity(PUT_YOUR_INTENT_HERE);
    }
});
47
ccheneson
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);
             }
         });
     }
}
28
edwin

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

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

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

      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
DevKRos

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