webentwicklung-frage-antwort-db.com.de

Aktivitätsmethode vom Adapter aufrufen

Ist es möglich, eine in Activity definierte Methode von ListAdapter aufzurufen?

(Ich möchte eine Button in list's-Zeile erstellen und wenn diese Schaltfläche angeklickt wird, sollte sie die in der entsprechenden Aktivität definierte Methode ausführen. Ich habe versucht, onClickListener in meiner ListAdapter zu setzen. was ist der Weg ...) 

wenn ich Activity.this.method() verwendet habe, erhalte ich folgende Fehlermeldung:

No enclosing instance of the type Activity is accessible in scope

Irgendeine Idee ?

98
user1602687

Ja, du kannst.

Fügen Sie im Adapter ein neues Feld hinzu:

private Context mContext;

Fügen Sie im Adapter-Konstruktor den folgenden Code hinzu: 

public AdapterName(......,Context context){
//your code.
this.mContext=context;
}

In der getView (...) des Adapters: 

Button btn=(Button)convertView.findViewById(yourButtonId);
btn.setOnClickListener(new Button.OnClickListener() {

        @Override
        public void onClick(View v) {
            if(mContext instanceof YourActivityName){
                ((YourActivityName)mContext).yourDesiredMethod();
            }
        }
    });

ersetzen Sie Ihre eigenen Klassennamen, wo Sie Ihren Code, Ihre Aktivitäten usw. sehen.

Wenn Sie denselben Adapter für mehrere Aktivitäten verwenden müssen, gilt Folgendes: 

Erstellen Sie eine Schnittstelle

public interface IMethodCaller{
    void yourDesiredMethod();
}

Implementieren Sie diese Schnittstelle in Aktivitäten, die Sie benötigen, um über diese Methodenaufruf-Funktionalität zu verfügen.

Dann rufen Sie in Adapter getView () wie folgt auf: 

Button btn=(Button)convertView.findViewById(yourButtonId);

btn.setOnClickListener(new Button.OnClickListener() {

    @Override
    public void onClick(View v) {
        if(mContext instanceof IMethodCaller){
            ((IMethodCaller)mContext).yourDesiredMethod();
        }
    }
});

Du bist fertig. Wenn Sie diesen Adapter für Aktivitäten verwenden müssen, für die dieser Aufrufmechanismus nicht erforderlich ist, wird der Code nicht ausgeführt (Wenn die Prüfung fehlschlägt).

272
Eldhose M Babu

Sie können es so machen:

Schnittstelle deklarieren:

public interface MyInterface{
    public void foo();
}

Lassen Sie Ihre Aktivität es vervollständigen:

public class MyActivity extends Activity implements MyInterface{
    public void foo(){
        //do stuff
    }
}

Dann übergeben Sie Ihre Aktivität an ListAdater:

public MyAdapter extends BaseAdater{
    private MyInterface listener;

    public MyAdapter(MyInterface listener){
        this.listener = listener;
    }
}

Und irgendwo im Adapter, wenn Sie diese Aktivitätsmethode aufrufen müssen:

listener.foo();
109
Igor Filippov

Original:

Ich verstehe die aktuelle Antwort, brauchte aber ein klareres Beispiel. Hier ist ein Beispiel, was ich mit einer Adapter (RecyclerView.Adapter) und einer Activity verwendet habe.

In Ihrer Aktivität:

Dies wird die interface implementieren, die wir in unserer Adapter haben. In diesem Beispiel wird es aufgerufen, wenn der Benutzer auf ein Element in der RecyclerView klickt.

public class MyActivity extends Activity implements AdapterCallback {

    private MyAdapter mMyAdapter;

    @Override
    public void onMethodCallback() {
       // do something
    }

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.mMyAdapter = new MyAdapter(this);
    }
}

In Ihrem Adapter:

In der Activity haben wir unsere Adapter initiiert und als Argument an den Konstruktor übergeben. Dadurch wird unsere interface für unsere Callback-Methode initiiert. Sie sehen, dass wir unsere Callback-Methode für Klicks von Benutzern verwenden.

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private AdapterCallback mAdapterCallback;

    public MyAdapter(Context context) {
        try {
            this.mAdapterCallback = ((AdapterCallback) context);
        } catch (ClassCastException e) {
            throw new ClassCastException("Activity must implement AdapterCallback.");
        }
    }

    @Override
    public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) {
        // simple example, call interface here
        // not complete
        viewHolder.itemView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mAdapterCallback.onMethodCallback();
                } catch (ClassCastException exception) {
                   // do something
                }
            }
        });
    }

    public static interface AdapterCallback {
        void onMethodCallback();
    }
}
54
Jared Burrows

Grundlegend und einfach.

Verwenden Sie dies in Ihrem Adapter einfach.

((YourParentClass) -Kontext) .functionToRun ();

12
Ck Maurya

Ein weiterer Weg ist:

Schreiben Sie eine Methode in Ihren Adapter, sagen wir Public void callBack () {}.

Überschreiben Sie diese Methode beim Erstellen eines Objekts für den Adapter in Activity .. .. Die Überschreibungsmethode wird aufgerufen, wenn Sie die Methode im Adapter aufrufen.

     Myadapter adapter = new Myadapter(){

                 @override
                 public void callBack(){
                    // dosomething
                 }
   };
6
if(parent.getContext() instanceof yourActivity){
//execute code
}

diese Bedingung ermöglicht es Ihnen, etwas auszuführen, wenn die Aktivität, die GroupView enthält, die Ansichten von der getView()-Methode Ihrer adapter anfordert, yourActivity ist.

HINWEIS: parent ist diese Gruppenansicht

0
Abd Salam Baker

Für Kotlin: 

In Ihrem Adapter einfach anrufen 

(context as Your_Activity_Name).your_method_name()
0
Numair