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 が持ってるクラス (オブジェクト) に操作があれば何とかなるのかどうなのか。