2010-11-16 15 views
47

Ho un ListActivity con il mio adattatore personalizzato. e all'interno di ciascuna vista, potrebbe avere alcuni pulsanti, in cui ho bisogno di implementare OnClickListener. Devo implementare OnClickListener nell'adattatore. Tuttavia, non so come chiamare la funzione come startActivity() o setResult(). poiché l'adattatore non si estende ad Activity.Come avviare Activity in adapter?

quindi qual è il modo migliore per risolvere questo problema? grazie

risposta

133

È sufficiente passare il contesto corrente al costruttore dell'adapter e archiviarlo come campo. Quindi all'interno di onClick puoi usare quel contesto per chiamare startActivity().

pseudo-codice

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

grazie mille !!!! risolvi il mio problema! – justicepenny

+0

ma un'altra domanda, e se devo chiamare setResult? perché ho bisogno di chiamare funzioneActivityResult (...) nella mia attività. Grazie per l'aiuto. – justicepenny

+1

Se si desidera restituire un risultato dall'attività figlio, è necessario avviare l'attività con startActivityForResult anziché StartActivity e sovrascrivere onActivityResult (che viene chiamato al termine dell'attività del figlio). –

43

Nell'attuare il onClickListener, è possibile utilizzare v.getContext.startActivity.

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

grazie mille risolvi il mio problema! – justicepenny

+1

ma un'altra domanda, e se devo chiamare setResult? perché ho bisogno di chiamare funzioneActivityResult (...) nella mia attività. Grazie per l'aiuto. – justicepenny

24
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); 
      } 
     }); 
    } 
} 
+0

funziona come un incantesimo .. –

+1

Un thread vecchio, ma aggiungendo per i risultati di ricerca più recenti: questo callback dall'adattatore ha un pattern anti design, in quanto gli intent dovrebbero essere creati ed eseguiti all'interno delle attività. – DevKRos

1

richiamata da adattatore per l'attività può essere fatto utilizzando ascoltatore registrazione sotto forma di interfaccia: Fai interfaccia:

 public MyInterface{ 
     public void yourmethod(//incase needs parameters); 
     } 

In dell'adattatore diciamo 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"); 
      } 

// fai ciò in cui devi attivare l'ascoltatore l

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

     In Activity Implement your method: 


     MyActivity extends AppCompatActivity implements MyInterface{ 

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

Per le versioni più recenti di sdk è necessario impostare attività di attività flag.

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