1. ホーム
  2. android

[解決済み] カスタムセレクタによるListViewアイテムの背景

2023-01-07 19:51:05

質問

リストビューの各アイテムに、リストセレクタを介してカスタム背景を適用することは可能でしょうか。

デフォルトのセレクタは @android:color/transparent を指定します。 state_focused="false" の場合、これを何らかのカスタム drawable に変更しても、選択されていないアイテムには影響しません。Romain Guy は次のように提案しているようです。 を提案しているようですが、この回答では を示唆しているようです。

私は現在、各ビューでカスタム背景を使用し、アイテムが選択/フォーカス/何でもされたときにそれを隠してセレクタを表示することによって同じ効果を達成していますが、これをすべて1つの場所で定義する方がよりエレガントでしょう。

参考までに、これは私がこれを動作させるために使用しているセレクタです。

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="false"
        android:drawable="@drawable/list_item_gradient" />

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item android:state_focused="true" android:state_enabled="false"
        android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_disabled" />
    <item android:state_focused="true" android:state_enabled="false"
        android:drawable="@drawable/list_selector_background_disabled" />

    <item android:state_focused="true" android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_transition" />
    <item android:state_focused="false" android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_transition" />

    <item android:state_focused="true"
        android:drawable="@drawable/list_selector_background_focus" />

</selector>

そして、このようにセレクタを設定しています。

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:listSelector="@drawable/list_selector_background" />    

ご協力ありがとうございました。

どのように解決するのですか?

私自身、この問題でイライラしていたのですが、ようやく解決しました。Romain Guyがヒントにしているように、別の状態があります。 "android:state_selected" を使用する必要があります。リスト項目の背景にはステートの drawable を使用し、別のステートの drawable を listSelector には別の状態のdrawableを使います。

list_row_layout.xmlを使用します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:background="@drawable/listitem_background"
    >
...
</LinearLayout>

listitem_background.xmlを参照してください。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@color/android:transparent" />
    <item android:drawable="@drawable/listitem_normal" />
</selector>

ListViewを含むlayout.xml。

...
<ListView 
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:listSelector="@drawable/listitem_selector"
   />
...

listitem_selector.xmlを参照してください。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/listitem_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/listitem_selected" />
</selector>