やりたかったのは、SimpleCursorAdapterを使っているListViewのItem要素の中に複数のclickできるViewがあり、それぞれのclickで異なる動作をすること。
ポイントは
- ListViewの拡張
- SimpleCursorAdapterの拡張
サンプルとして使うItem要素のxmlはこんな感じ
(今回はTextViewにlistenerをつける。
@stringと@dimensは別に定義してるもの)
(今回はTextViewにlistenerをつける。
@stringと@dimensは別に定義してるもの)
list_item.xml
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="8dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:paddingBottom="8dp"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/name_textview"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="@dimen/text_size_large" />
- <TextView
- android:id="@+id/point_textview"
- android:layout_below="@id/name_textview"
- android:layout_alignParentLeft="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="@dimen/text_size_small" />
- <TextView
- android:id="@+id/delete_textview"
- android:layout_below="@id/name_textview"
- android:layout_alignParentRight="true"
- android:layout_width="48dp"
- android:layout_height="24dp"
- android:gravity="center"
- android:text="@string/textview_label_delete"
- android:textSize="@dimen/text_size_small" />
- <View
- android:id="@+id/separator_view_to_left_of_delete"
- android:layout_below="@id/name_textview"
- android:layout_toLeftOf="@id/delete_textview"
- android:layout_width="2dp"
- android:layout_height="24dp"
- android:background="@android:color/darker_gray" />
- <TextView
- android:id="@+id/edit_textview"
- android:layout_below="@id/name_textview"
- android:layout_toLeftOf="@id/separator_view_to_left_of_delete"
- android:layout_width="48dp"
- android:layout_height="24dp"
- android:gravity="center"
- android:text="@string/textview_label_edit"
- android:textSize="@dimen/text_size_small" />
- <View
- android:id="@+id/separator_view_to_left_of_edit"
- android:layout_below="@id/name_textview"
- android:layout_toLeftOf="@id/edit_textview"
- android:layout_width="2dp"
- android:layout_height="24dp"
- android:background="@android:color/darker_gray" />
- <TextView
- android:id="@+id/record_textview"
- android:layout_below="@id/name_textview"
- android:layout_toLeftOf="@id/separator_view_to_left_of_edit"
- android:layout_width="48dp"
- android:layout_height="24dp"
- android:gravity="center"
- android:text="@string/textview_label_record"
- android:textSize="@dimen/text_size_small" />
- </RelativeLayout>
次にListViewを拡張したMyListView。
- /**
- * リスト内にボタンを配置して、ボタンが押された時にonItemClickを通知するListView
- */
- public class MyListView extends ListView implements OnClickListener {
- /**
- * コンストラクタ
- */
- public MyListView(Context context) {
- super(context);
- }
- /**
- * コンストラクタ
- */
- public MyListView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- @Override
- public void onClick(View v) {
- int pos = (Integer)v.getTag();
- this.performItemClick(v, pos, v.getId());
- }
- }
次にSimpleCursorAdapterを拡張したMyCursorAdapter
- private class MyCursorAdapter extends SimpleCursorAdapter {
- public MyCursorAdapter(Context context, int layout, Cursor c,
- String[] from, int[] to, int flags) {
- super(context, layout, c, from, to, flags);
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- // viewのセットなどはスーパークラスのメソッドに任せる
- View view = super.getView(position, convertView, parent);
- /*
- * それぞれのTextViewにpositionTagと
- * MyListViewのlistenerをつける
- */
- TextView deleteTextView = (TextView)view.findViewById(
- R.id.delete_textview);
- deleteTextView.setTag(position);
- deleteTextView.setOnClickListener((MyListView)parent);
- TextView editTextView = (TextView)view.findViewById(
- R.id.edit_textview);
- editTextView.setTag(position);
- editTextView.setOnClickListener((MyListView)parent);
- TextView recordTextView = (TextView)view.findViewById(
- R.id.record_textview);
- recordTextView.setTag(position);
- recordTextView.setOnClickListener((MyListView)parent);
- return view;
- }
- }
これで、アイテム要素の中のonClick()でListViewのonItemClick()が呼ばれるようになるので、
onItemClick()の中でidで処理を切り替えればOK。
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
- switch(view.getId()) {
- case R.id.delete_textview:
- // 消去の時の処理
- break;
- case R.id.edit_textview:
- // 編集の時の処理
- break;
- case R.id.record_textview:
- // 記録の時の処理
- break;
- default:
- // 通常のonItemClick()の時の処理
- break;
- }
- }
参考にした記事
ListViewの中のボタンのクリックイベントをActivityに通知する
0 件のコメント:
コメントを投稿