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 ?
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).
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();
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.
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 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();
}
}
Grundlegend und einfach.
Verwenden Sie dies in Ihrem Adapter einfach.
((YourParentClass) -Kontext) .functionToRun ();
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
}
};
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
Für Kotlin:
In Ihrem Adapter einfach anrufen
(context as Your_Activity_Name).your_method_name()