自己解決しました。良いご意見も頂いたのですが、せっかくなので私の解決方法も掲載してみます。
ListViewに以下のようにタップのイベントを定義します。このイベントでコンテキストメニューを表示します。()
lang
1private AdapterView.OnItemClickListener onItemClickListener = new AdapterView.OnItemClickListener() {
2 @Override
3 public void onItemClick(AdapterView<?> listView, View view, int position, long id) {
4 Log.d(TAG,"たっぷされたお");
5 HogeListAdapter adapter = (HogeListAdapter )listView.getAdapter();
6 HogeItem hogeItem = (HogeItem )adapter.getItem(position);
7 if(null != hogeItem ) {
8 Log.d(TAG,"アイテムみつかった!メニューひらくよ!");
9 view.setTag(R.string.tag_hoge_item,hogeItem );
10 activity.registerForContextMenu(view);//コンテキストメニューを開くアクティビティに、Viewを登録する
11 view.showContextMenu();//ロングタップでないので、こうやって呼び出す必要がある
12 view.setLongClickable(false);//ロングタップ無効
13
14 }else{
15 Log.d(TAG,"タップされたけど、アイテムなかったらしい");
16 }
17 Log.d(TAG,"");
18 }
19 };
ポイントとしては、AdapterからgetItem(position)でアイテムを取得する事と、
Viewにタグを設定している事です。
タグの設定の時にリソースを指定できるのですが、こうする事でリソースIDの種類によって数種類の情報をタグに入れられるので便利です。
次にActivityです。
lang
1
2 public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo info) {
3 super.onCreateContextMenu(menu, view, info);
4 HogeItem hogeItem = (HogeItem )view.getTag(R.string.tag_hoge_item);
5 if(null != hogeItem){
6 //アイテムをロングタップしたようです。
7 getMenuInflater().inflate(R.menu.hogelist_context_nemu, menu);
8 for(int i = 0;i < menu.size();i++) {
9 MenuItem menuItem = menu.getItem(i);
10 menuItem.setActionView(view);
11 }
12 }
13 }
ポイントは、タグを指定してitemを取得し、内容によって処理を切り分ける事。
また、表示するメニューのmenuItemに、setActionView(view)によってViewを与えている事。
最後に、メニューのクリック時のイベントです。
lang
1
2 @Override
3 public boolean onContextItemSelected(MenuItem item) {
4 View v = item.getActionView();
5 HogeItem hogeItem = (HogeItem)v.getTag(R.string.tag_hoge_item);
6 }
メニューのクリック時のイベントで、タグを指定してViewを取り出します。
これで、選択したアイテムの情報を取得出来ました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/02/15 03:18