2013/02/07

SimpleCursorAdapterを使っているListViewのアイテム要素にListenerをつける

AndroidでSimpleCursorAdapterを使っているListViewでレイアウトの中にListenerをつけたので、その備忘録として。

やりたかったのは、SimpleCursorAdapterを使っているListViewのItem要素の中に複数のclickできるViewがあり、それぞれのclickで異なる動作をすること。

ポイントは

  • ListViewの拡張
  • SimpleCursorAdapterの拡張

サンプルとして使うItem要素のxmlはこんな感じ
(今回はTextViewにlistenerをつける。
@stringと@dimensは別に定義してるもの)

list_item.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:paddingTop="8dp"  
  6.     android:paddingLeft="16dp"  
  7.     android:paddingRight="16dp"  
  8.     android:paddingBottom="8dp"  
  9.     android:orientation="vertical" >  
  10.       
  11.     <TextView  
  12.         android:id="@+id/name_textview"  
  13.         android:layout_alignParentTop="true"  
  14.         android:layout_alignParentLeft="true"  
  15.         android:layout_width="match_parent"  
  16.         android:layout_height="wrap_content"  
  17.         android:textSize="@dimen/text_size_large" />  
  18.       
  19.     <TextView  
  20.         android:id="@+id/point_textview"  
  21.         android:layout_below="@id/name_textview"  
  22.         android:layout_alignParentLeft="true"  
  23.         android:layout_width="wrap_content"  
  24.         android:layout_height="wrap_content"  
  25.         android:textSize="@dimen/text_size_small" />  
  26.       
  27.     <TextView  
  28.         android:id="@+id/delete_textview"  
  29.         android:layout_below="@id/name_textview"  
  30.         android:layout_alignParentRight="true"  
  31.         android:layout_width="48dp"  
  32.         android:layout_height="24dp"  
  33.         android:gravity="center"  
  34.         android:text="@string/textview_label_delete"  
  35.         android:textSize="@dimen/text_size_small" />  
  36.       
  37.     <View  
  38.         android:id="@+id/separator_view_to_left_of_delete"  
  39.         android:layout_below="@id/name_textview"  
  40.         android:layout_toLeftOf="@id/delete_textview"  
  41.         android:layout_width="2dp"  
  42.         android:layout_height="24dp"  
  43.         android:background="@android:color/darker_gray" />  
  44.       
  45.     <TextView  
  46.         android:id="@+id/edit_textview"  
  47.         android:layout_below="@id/name_textview"  
  48.         android:layout_toLeftOf="@id/separator_view_to_left_of_delete"  
  49.         android:layout_width="48dp"  
  50.         android:layout_height="24dp"  
  51.         android:gravity="center"  
  52.         android:text="@string/textview_label_edit"  
  53.         android:textSize="@dimen/text_size_small" />  
  54.       
  55.     <View  
  56.         android:id="@+id/separator_view_to_left_of_edit"  
  57.         android:layout_below="@id/name_textview"  
  58.         android:layout_toLeftOf="@id/edit_textview"  
  59.         android:layout_width="2dp"  
  60.         android:layout_height="24dp"  
  61.         android:background="@android:color/darker_gray" />  
  62.       
  63.     <TextView  
  64.         android:id="@+id/record_textview"  
  65.         android:layout_below="@id/name_textview"  
  66.         android:layout_toLeftOf="@id/separator_view_to_left_of_edit"  
  67.         android:layout_width="48dp"  
  68.         android:layout_height="24dp"  
  69.         android:gravity="center"  
  70.         android:text="@string/textview_label_record"  
  71.         android:textSize="@dimen/text_size_small" />  
  72.       
  73. </RelativeLayout>  

次にListViewを拡張したMyListView。
  1. /** 
  2.  * リスト内にボタンを配置して、ボタンが押された時にonItemClickを通知するListView 
  3.  */  
  4. public class MyListView extends ListView implements OnClickListener {  
  5.       
  6.     /** 
  7.      * コンストラクタ 
  8.      */  
  9.     public MyListView(Context context) {  
  10.         super(context);  
  11.     }  
  12.       
  13.     /** 
  14.      * コンストラクタ 
  15.      */  
  16.     public MyListView(Context context, AttributeSet attrs) {  
  17.         super(context, attrs);  
  18.     }  
  19.   
  20.     @Override  
  21.     public void onClick(View v) {  
  22.         int pos = (Integer)v.getTag();  
  23.         this.performItemClick(v, pos, v.getId());  
  24.     }  
  25. }  

次にSimpleCursorAdapterを拡張したMyCursorAdapter
  1. private class MyCursorAdapter extends SimpleCursorAdapter {  
  2.   
  3.         public MyCursorAdapter(Context context, int layout, Cursor c,  
  4.                 String[] from, int[] to, int flags) {  
  5.             super(context, layout, c, from, to, flags);  
  6.         }  
  7.           
  8.         @Override  
  9.         public View getView(int position, View convertView, ViewGroup parent) {  
  10.             // viewのセットなどはスーパークラスのメソッドに任せる  
  11.             View view = super.getView(position, convertView, parent);  
  12.               
  13.             /* 
  14.              * それぞれのTextViewにpositionTagと 
  15.              * MyListViewのlistenerをつける 
  16.              */  
  17.             TextView deleteTextView = (TextView)view.findViewById(  
  18.                     R.id.delete_textview);  
  19.             deleteTextView.setTag(position);  
  20.             deleteTextView.setOnClickListener((MyListView)parent);  
  21.               
  22.             TextView editTextView = (TextView)view.findViewById(  
  23.                     R.id.edit_textview);  
  24.             editTextView.setTag(position);  
  25.             editTextView.setOnClickListener((MyListView)parent);  
  26.   
  27.             TextView recordTextView = (TextView)view.findViewById(  
  28.                     R.id.record_textview);  
  29.             recordTextView.setTag(position);  
  30.             recordTextView.setOnClickListener((MyListView)parent);  
  31.             return view;  
  32.         }  
  33.     }  

これで、アイテム要素の中のonClick()でListViewのonItemClick()が呼ばれるようになるので、
onItemClick()の中でidで処理を切り替えればOK。
  1. @Override  
  2. public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {  
  3.   
  4.     switch(view.getId()) {  
  5.         case R.id.delete_textview:  
  6.             // 消去の時の処理  
  7.             break;  
  8.         case R.id.edit_textview:  
  9.             // 編集の時の処理  
  10.             break;  
  11.         case R.id.record_textview:  
  12.             // 記録の時の処理  
  13.             break;  
  14.         default:  
  15.             // 通常のonItemClick()の時の処理  
  16.             break;  
  17.     }  
  18. }  

参考にした記事
ListViewの中のボタンのクリックイベントをActivityに通知する

0 件のコメント:

コメントを投稿