ちょっと悩んだので、今後のためにまとめ。
Adapter内で、Activity に記述したメソッドを呼び出す方法です。
Interface を使用しています。
なお、今回参考にしたのはこちらのサイトです。
Android – Call Activity method from adapter – Stack Overflow
https://stackoverflow.com/questions/12142255/call-activity-method-from-adapter
2つ目のアンサーに書かれている内容を参考にしました。
では早速コードを書いていきます。
まず、インターフェースを作成します。
で、Adapter で呼び出したい& Activity に追加するメソッドを定義します。
public interface [インターフェース名] { void test(); }
なお、この時指定するのは、メソッド名・引数・戻り値のみで、処理内容は記述しません。
次に、Activityに、上で作成したインターフェースを、下記のように implements で実装します。
public class [アクティビティ名] extends AppCompatActivity implements [インターフェース名] {
Android Studioを使用している場合、上記のようにインターフェースを追加すると、メソッドをオーバーライドして!というエラーになるので、Alt+Enter で言われるがままにメソッドを追加します。
なお、追加するメソッドは下記のとおりです。
最初に @Override
が付くのにお気を付けください。
@Override public void test() { // メソッド内で行いたい処理 }
そして Adapterに、下記を追加します。
public [アダプター名] extends BaseAdater{ private [インターフェース名] listener; public [アダプター名]([インターフェース名] listener){ this.listener = listener; } }
で、あとは下記のように使いたいタイミングでメソッドを呼び出すだけです。
listener.test();
で、私がハマったのが、Adapterでの定義で、継承しているのが BaseAdapter ではなかったので、上記の記述では動かなかったんですよね…。
なので、下記のように修正。
まず、Adapter。
private int mResource; private List<EntryListItem> mItems; private LayoutInflater mInflater; private Context mContext; private ListViewInterface listener; public [アダプター名](Context context, int resource, List<EntryListItem> items, [インターフェース名] listener) { super(context, resource, items); this.mContext = context; mResource = resource; mItems = items; mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.listener = listener; }
一部必要ないものも混じっていますが、それはスルーしてください。
次は、このままでは、Activitiy でエラーになるので Adapter を new している所を修正します。
[アダプター名] adapter = new [アダプター名](getBaseContext(), R.layout.[レイアウトファイル名], item, this);
最後の this
がインターフェースを指しています。
ここが分からず、少し悩みました…。
以上、Activity内のメソッドをAdapterで呼び出す方法でした。
もしかしたら、ListViewを扱うときなどに使うことがあるかもしれませんので、その際は是非ご活用ください。