2010-11-16 5 views
47

J'ai une ListActivity avec mon adaptateur personnalisé. et à l'intérieur de chaque vue, il peut y avoir des boutons, dans lesquels j'ai besoin d'implémenter OnClickListener. J'ai besoin d'implémenter le OnClickListener dans l'adaptateur. Cependant, je ne sais pas comment appeler la fonction comme startActivity() ou setResult(). puisque l'adaptateur ne s'étend pas à l'activité.Comment démarrer l'activité dans l'adaptateur?

alors quelle est la meilleure façon de résoudre ce problème? merci

Répondre

133

Passez simplement dans le contexte actuel au constructeur de l'adaptateur et stockez-le comme un champ. Puis, dans onClick, vous pouvez utiliser ce contexte pour appeler startActivity().

pseudo-code

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

merci beaucoup, vous résolvez mon problème! – justicepenny

+0

mais encore une question, et si je dois appeler setResult? parce que j'ai besoin d'appeler la fonction onActivityResult (...) dans mon activité. Merci de votre aide. – justicepenny

+1

Si vous souhaitez renvoyer un résultat de l'activité enfant, vous devez démarrer l'activité avec startActivityForResult au lieu de StartActivity et remplacer le paramètre onActivityResult (qui est appelé après la fin de l'activité enfant). –

43

Lors de la mise en œuvre du onClickListener, vous pouvez utiliser v.getContext.startActivity.

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

merci beaucoup de résoudre mon problème! – justicepenny

+1

mais encore une question, et si je dois appeler setResult? parce que j'ai besoin d'appeler la fonction onActivityResult (...) dans mon activité. Merci de votre aide. – 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

fonctionne comme un charme .. –

+1

Un ancien thread mais en ajoutant pour les résultats de recherche plus récents: ce rappel de l'adaptateur va anti modèle de conception comme intentions devraient être créés et exécutés dans les activités auditeurs sont les meilleurs pour ce cas utilisé. – DevKRos

1

rappel de l'adaptateur à l'activité peut être fait en utilisant l'auditeur enregistrement sous forme d'interface: Faire une interface:

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

adaptateur Let Say 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"); 
      } 

// fais cela où tu dois tirer l'écouteur 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

Pour les versions plus récentes de sdk, vous devez définir la tâche d'activité de l'indicateur.

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