ListView な行にボタン追加して ListPopupWindow を表示
Android Design の application structure にある Allow cutting through hierarchies なナニ。以下の手順で順に盛り込んでみました。
- ListFragment 使ってリスト表示
- 行のフォーマット変更
- RelativeLayout 使って右端にボタンを表示
- クリックで ListPopupWindow 表示
までは何とかなったんですが ListView の行位置が取れぬことが判明。
実装
長いので一部のみ。ArrayAdapter 拡張したカスタムなナニを作ってるんですが getView() メソドの中でボタンな処理が以下のような実装になってまして
Button mButton = (Button)convertView.findViewById(R.id.button); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String[] data = {"data1", "data2", "data3", "data4"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, data); final ListPopupWindow lpw = new ListPopupWindow(context); lpw.setAdapter(adapter); n lpw.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) { String s = (String)adapter.getItemAtPosition(pos);
onItemClick の中でどの行で、という情報が取れないと微妙ですよね、という事態に至っている訳です (ListPopupWindow の行位置は無論取得可能)。いっちゃんイージーな解としては生成してるオブジェクトそれぞれ (OnClickListener および AdapterView.OnItemClickListener) を拡張して行番号持たせる、という微妙な方法。つうかクロージャ使えるようにならんかな、今すぐ。
とは言え
出てる例としては、ある音源に対して
- play
- Available offline
- Add to playlist
- More by artist
- Shop for artist
- Search
というメニュになってて基本的に Intent 投げるカンジになるのであれば何とかなるのか、あるいはカスタムな Adapter が持ってるクラス (オブジェクト) に操作があれば何とかなるのかどうなのか。