読者です 読者をやめる 読者になる 読者になる

【android】Fragment上のListViewに置かれたボタンのonClickを処理する

android Java

はじめに

今回やりたかったのは、ListViewのセル上に削除ボタンとかをおいてクリックされたらListViewから削除するようなこと。
ListViewを作るのがActivityとFragmentとでやり方が違うみたい。

Activityの場合は以下みたいな形でボタンのイベントが取得できる。

xml

<Button ・・・
  android:id="@+id/myButton"
  android:onClick="myFunc"
 />

Adapter

public View getView(final int position, View convertView, ViewGroup parent) {
    ・・・
    Button myButton = (Button)convertView.findViewById(R.id.myButton);
    myButton.setTag(position);
    ・・・
}

Activity

public void myFunc(View view) {
    // ListView上のボタンがおされたら呼ばれる
    // view.getTag()でどの行が押されたかわかる
}

けど、Fragmentを使ってる場合はFragmentを呼び出してるActivityで実装されているmyFuncが呼ばれるためやりたいこととは違った。

Fragmentの場合

xmlのButtonにonClick属性はセットしない。
やり方わからなかったので、アダプターにインターフェースを定義して呼び出し元(Fragment)にメソッドを実装させる形で実装してみた。

xml

<Button ・・・
  android:id="@+id/myButton"
 />

Adapter

public class MyAdapter extends ArrayAdapter<MyData> {

    private MyAdapterListener listener;

    public interface MyAdapterListener {
        void myFunc(Object position);
    }

    public void setListener(MyAdapterListener listener) {
        this.listener = listener;
    }

    ・・・

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ・・・
        Button myButton = (Button)convertView.findViewById(R.id.myButton);
        myButton.setTag(position);
        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.myFunc(v.getTag());
            }
        });
        return convertView;
    }
}

Fragment

public class MyFragment extends Fragment implements MyAdapter.MyAdapterListener {
    ・・・
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ・・・

        // アダプターで用意したsetListnerメソッドで関連づける
        mAdapter = new MyAdapter(getContext(), 0, ・・・);
        mAdapter.setListener(this);
    }

    public void myFunc(Object position) {
        // 呼ばれた!!
    }
}

もっといいやり方ありそうだけど。。以上です