ListViewで選択行の色を変える

2009-10/9 書き直しました。
http://d.hatena.ne.jp/isher/20091009

Androidのレイアウトの中で、ListViewは最も使用場面の多いものの一つだと思います。ただ、多機能なので、ちょっと凝った事しようとすると色々と面倒です。ListViewとAdapterを使うのですが、SwingのJTableとTableModelの関係に似てます。
とりあえずSDKの「platforms/android-1.5/samples/ApiDemos」に色々なサンプルが入ってるので覗いてみましょう。eclipseで、パッケージエクスプローラから新規Android Project、ソースから作成で、ApiDemosを選択すればプロジェクトを作成出来ます。

選択行の色を変える

サンプルに無かったので、どうやるか調べてみました。標準ではオレンジ色です。
コードであればListViewのsetSelectorメソッド、レイアウトを使うならandroid:listSelectorで設定するようです。AbsListView | Android Developers
設定方法はレイアウトIDを指定するかDrawableオブジェクトを指定するかの二通りがあります。

Drawableオブジェクトで設定する
ListView list = (ListView)findViewById(R.id.ListView01);        
list.setSelector(new PaintDrawable(Color.BLUE));

選択行を青色にします。Drawableを上手く使えば凝った事も出来そうです。
左側がデフォルトで、右側が青色に変えた例。

単色であれば↓の方法が正しいと思うのですが

list.setSelector(new ColorDrawable(Color.BLUE));

何故か選択行以外の全ての行の色が変わってしまいます。調べてみると単色の指定で起こるバグっぽい・・・Google Groups

レイアウトIDで設定する
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="solid_red">#ff0000</drawable>
    <drawable name="solid_blue">#0000ff</drawable>
</resources>

valuesの下にxml作って

list.setSelector(R.drawable.solid_blue);

これでOKのはずなのですが、上のバグにより上手く動作しません。レイアウトxmlandroid:listSelectorでも無理です。現状コード上でDrawableオブジェクト使って設定するしか出来ないようです。(AndroidSDK1.5-r2にて)