2010-11-16 14 views
47

Ich habe eine ListActivity mit meinem angepassten Adapter. und innerhalb jeder Ansicht kann es einige Schaltflächen haben, in denen ich OnClickListener implementieren muss. Ich muss den OnClickListener im Adapter implementieren. Allerdings weiß ich nicht, wie man die Funktion wie startActivity() oder setResult() aufruft. da der Adapter nicht zu Activity reicht.Wie starte ich die Aktivität im Adapter?

Also, was ist der beste Weg, um dieses Problem zu lösen? danke

Antwort

133

Übergeben Sie einfach den aktuellen Kontext an den Adapterkonstruktor und speichern Sie es als ein Feld. Innerhalb von onClick können Sie dann diesen Kontext verwenden, um startActivity() aufzurufen.

Pseudocode

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

danke viel !!!! Sie lösen mein Problem! – justicepenny

+0

aber noch eine Frage, was ist, wenn ich setResult aufrufen muss? weil ich onActivityResult (...) in meiner Aktivität aufrufen muss. danke für Ihre Hilfe. – justicepenny

+1

Wenn Sie ein Ergebnis aus der untergeordneten Aktivität zurückgeben möchten, müssen Sie die Aktivität mit startActivityForResult anstelle von StartActivity starten und OnActivityResult überschreiben (das nach dem Ende der untergeordneten Aktivität aufgerufen wird). –

43

Wenn die onClickListener Implementierung können Sie v.getContext.startActivity verwenden.

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

Vielen Dank, Sie lösen mein Problem! – justicepenny

+1

aber noch eine Frage, was ist, wenn ich setResult aufrufen muss? weil ich onActivityResult (...) in meiner Aktivität aufrufen muss. danke für Ihre Hilfe. – 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

funktioniert wie ein Charme .. –

+1

Ein alter Thread aber für neuere Suchergebnisse hinzufügen: Dieser Callback von Adapter geht Anti-Design-Muster als Intents erstellt und in Aktivitäten ausgeführt werden Listener sind am besten für diesen Fall verwendet. – DevKRos

1

Rückruf von Adapter-Aktivität kann mit der Registrierung Zuhörer in Form von Schnittstelle getan werden: eine Schnittstelle Fabrikat:

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

In Adapter Sagen wir 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"); 
      } 

// Tun Sie dies, wo Sie Hörer hören müssen 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

Für neuere Versionen von SDK müssen Sie Flag Aktivität Aufgabe setzen.

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