Wie starte ich die Aktivität im Adapter?

70

Ich habe eine ListActivity mit meinem benutzerdefinierten Adapter und in jeder Ansicht befinden sich möglicherweise einige Schaltflächen, die ich implementieren muss OnClickListener. Ich muss das OnClickListenerim Adapter implementieren . Ich weiß jedoch nicht, wie ich die Funktion wie startActivity()oder aufrufen soll setResult(). Da sich der Adapter nicht auf Aktivität erstreckt.

Was ist der beste Weg, um dieses Problem zu lösen?

Vielen Dank.

Gerechtigkeitspfennig
quelle

Antworten:

184

Übergeben Sie einfach den aktuellen Kontext an den Adapterkonstruktor und speichern Sie ihn als Feld. In onClick können Sie 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(...);
             }
         });
     }
}
Robby Pond
quelle
aber noch eine Frage, was ist, wenn ich setResult aufrufen muss? weil ich in meiner Aktivität die Funktion onActivityResult (...) aufrufen muss. danke für Ihre Hilfe.
Justicepenny
1
Wenn Sie ein Ergebnis der untergeordneten Aktivität zurückgeben möchten, müssen Sie die Aktivität mit startActivityForResult anstelle von StartActivity starten und onActivityResult (das nach dem Ende der untergeordneten Aktivität aufgerufen wird) überschreiben.
Robby Pond
1
@RobbyPond Context hat kein startActivityForResult ()! developer.android.com/reference/android/content/Context.html
Subin Sebastian
3
Sie können den Kontext folgendermaßen umwandeln: ((Aktivitäts-) Kontext) .startActivityForResults (intent, 0);
Xenione
Gibt es eine Möglichkeit, die aktuelle Aktivität von Extra und Finish () zu setzen?
Harishannam
58

Bei der Implementierung onClickListenerkönnen Sie verwenden v.getContext.startActivity.

btn.setOnClickListener(new OnClickListener() {                  
    @Override
    public void onClick(View v) {
        v.getContext().startActivity(PUT_YOUR_INTENT_HERE);
    }
});
Ccheneson
quelle
1
aber noch eine Frage, was ist, wenn ich setResult aufrufen muss? weil ich in meiner Aktivität die Funktion onActivityResult (...) aufrufen muss. danke für Ihre Hilfe.
Justicepenny
31
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, ToActivity.class); 
                   intent.putExtra("your_extra","your_class_value");
                 context.startActivity(intent);
             }
         });
     }
}
Edwin
quelle
1
Ein alter Thread, der jedoch für neuere Suchergebnisse hinzugefügt wird: Dieser Rückruf vom Adapter entspricht einem Anti-Design-Muster, da Absichten innerhalb von Aktivitäten erstellt und ausgeführt werden sollten, die Listener für diesen verwendeten Fall am besten geeignet sind.
DevKRos
13

Für neuere Versionen von sdk müssen Sie die Flag-Aktivitätsaufgabe festlegen.

public void onClick(View v)
 {
     Intent myactivity = new Intent(context.getApplicationContext(), OtherActivity.class);
     myactivity.addFlags(FLAG_ACTIVITY_NEW_TASK);
     context.getApplicationContext().startActivity(myactivity);
 }
Kamran
quelle
1
Dies ist die eigentliche Antwort aufgrund von: context.getApplicationContext (). StartActivity (myactivity); Wenn Sie nur context.startActivity (intent) verwenden, funktioniert es nicht! Lösen Sie einfach das Problem auf diese Weise für Kotlin auf Android
Ramiro GM
Das ist die wahre Antwort, ja!
Noor Hossain
2

Der Rückruf vom Adapter zur Aktivität kann über die Registrierung des Listeners in Form einer Schnittstelle erfolgen: Erstellen Sie eine Schnittstelle:

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

Im 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");
          }

// mach das, wo du den Listener l feuern musst l

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

      In Activity Implement your method:


         MyActivity extends AppCompatActivity implements MyInterface{

                yourmethod(){
                //do whatever you want
                     }
                     }
DevKRos
quelle
2

Einfache Möglichkeit, die Aktivität in der Adopter-Schaltfläche onClickListener zu starten:

Intent myIntent = new Intent(view.getContext(),Event_Member_list.class);                    myIntent.putExtra("intVariableName", eventsList.get(position).getEvent_id());
                view.getContext().startActivity(myIntent);
Sheraz Ahmed
quelle
1

Erste Lösung:

Sie können die Startaktivität in Ihrem Adapter folgendermaßen aufrufen:

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

Zweite Lösung:

Sie können onClickListenerIhren Button aus der YourAdapterKlasse heraus aufrufen . Folge diesen Schritten:

Erstellen Sie eine Schnittstelle wie diese:

public YourInterface{
         public void  yourMethod(args...);
}

Dann in Ihrem Adapter:

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

Und wo Sie Ihren Adapter initiieren, ist wie folgt:

YourAdapter adapter = new YourAdapter(getContext(), (args) -> {
            startActivity(...);
        });

Dieser Link kann für Sie nützlich sein.

Masoud Mokhtari
quelle
0

Wenn Sie eine URL anstelle einer Aktivität von Ihrer Adapterklasse umleiten möchten, übergeben Sie den Kontext von mit Startaktivität.

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);
            }
        });
Nimesh Patel
quelle