1. ホーム
  2. android

[解決済み] アダプタからActivityメソッドを呼び出す

2022-07-21 23:53:32

質問

で定義されたメソッドを呼び出すことは可能でしょうか? Activity から ListAdapter ?

(を作りたい)。 Buttonlist's の行で、このボタンがクリックされると、対応するアクティビティに定義されているメソッドを実行する必要があります。私は onClickListener を私の ListAdapter というメソッドがありますが、このメソッドをどのように呼び出すのか、そのパスは何なのかがわかりません...)

を使用したとき、私は Activity.this.method() というエラーが出ます。

No enclosing instance of the type Activity is accessible in scope

何か思いつくことはありますか?

どのように解決するのですか?

はい、できます。

アダプタの中で 新しいフィールドを追加します :

private Context mContext;

アダプタのコンストラクタに、次のコードを追加します。

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

AdapterのgetView(...)で。

Button btn = (Button) convertView.findViewById(yourButtonId);
btn.setOnClickListener(new Button.OnClickListener() {
  @Override
  public void onClick(View v) {
    if (mContext instanceof YourActivityName) {
      ((YourActivityName)mContext).yourDesiredMethod();
    }
  }
});

コードやアクティビティなどを表示するクラス名を自分のものに置き換えます。

この同じアダプタを複数のアクティビティに使用する必要がある場合は、 :

インターフェイスを作成する

public interface IMethodCaller {
    void yourDesiredMethod();
}

このメソッド呼び出し機能を必要とするアクティビティに、このインタフェースを実装します。

そして、Adapter getView()の中で、次のように呼び出します。

Button btn = (Button) convertView.findViewById(yourButtonId);
btn.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (mContext instanceof IMethodCaller) {
            ((IMethodCaller) mContext).yourDesiredMethod();
        }
    }
});

これで完了です。この呼び出し機構を必要としないアクティビティにこのアダプタを使用する必要がある場合、コードは実行されません(チェックに失敗した場合)。