【android】Fragment上のListViewに置かれたボタンのonClickを処理する
はじめに
今回やりたかったのは、ListViewのセル上に削除ボタンとかをおいてクリックされたらListViewから削除するようなこと。
ListViewを作るのがActivityとFragmentとでやり方が違うみたい。
Activityの場合は以下みたいな形でボタンのイベントが取得できる。
<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)にメソッドを実装させる形で実装してみた。
<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) { // 呼ばれた!! } }
もっといいやり方ありそうだけど。。以上です