ListViewのpadding設定

ListViewにpaddingを設定する

ListViewで子要素の配置を調整する場合、通常はandroid:paddingで描画領域を、android:dividerHeightで子要素同士の間隔を設定する。 この時、単純にandroid:paddingだけ指定すると以下のようにリストの上下端で子要素が途切れてしまう。

pict-Screenshot_2014-08-19-11-28-01.png

これを防ぐためには、android:clipToPadding属性でpadding領域であっても子要素を描画するように設定する。

    <ListView
        android:id="@android:id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/darker_gray"
        android:clipToPadding="false"
        android:divider="@null"
        android:dividerHeight="16dp"
        android:padding="16dp" />

pict-Screenshot_2014-08-19-11-27-37.png

styleで定義する

いちいちListViewに全部の設定を書くのは面倒なので、上記設定をstyleでやろうとするとこうなる。

    <style name="ListView">
        <item name="android:padding">16dp</item>
        <item name="android:clipToPadding">false</item>
        <item name="android:divider">@null</item>
        <item name="android:dividerHeight">16dp</item>
        <item name="android:background">@android:color/darker_gray</item>
    </style>
    <ListView
        android:id="@android:id/list"
        style="@style/ListView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

themeで定義する

いちいちListViewにstyleを書くのは面倒なので、上記設定をthemeでやろうとするとこうなる。

    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <item name="android:listViewStyle">@style/ListView</item>
    </style>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        ...

…のだが、なぜかうまくいかない。

pict-Screenshot_2014-08-19-11-28-01.png

どうやらthemeではandroid:clipToPaddingの設定が反映されないらしい。 仕方がないのでソースコード側でListView#setClipToPadding(false)を呼び出すと動く。 ListFragmentで標準レイアウトを使う場合、themeで基本レイアウトを指定した後android:clipToPaddingだけソースコードで上書きするしかなさそうだ。

getListView().setClipToPadding(false);

これでうまく表示できた

pict-Screenshot_2014-08-19-11-27-37.png