やりたかったのは、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 件のコメント:
コメントを投稿