Domanda

Sto cercando di impostare un ListView con elementi che hanno diversi colori di sfondo, quindi il metodo getView() del mio adattatore chiama setBackgroundResource() con una risorsa disegnabile appropriata per il colore di sfondo desiderato.

Se utilizzo un ColorDrawable che fa riferimento a un ColorStateList come il suo colore, il colore per lo stato pressato dal ColorStateList non viene disegnato quando tocca l'elemento.

Se utilizzo un StateListDrawable che fa riferimento a un ColorDrawable per lo stato pressato e un diverso ColorDrawable per lo stato non frequente, ottengo l'effetto di evidenziazione desiderato quando tocca l'elemento.

Ho creato un semplice progetto per dimostrarlo. Ecco il metodo getView() dal ListAdapter:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View retval = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, parent, false);
    TextView textView = (TextView)retval.findViewById(android.R.id.text1);
    textView.setText("" + position);

    switch ( position ) {
        case 0:
            retval.setBackgroundResource(R.drawable.list_background_item_0);
            break;

        case 1:
            retval.setBackgroundResource(R.drawable.list_background_item_1);
            break;
    }

    return retval;
}
.

Res / Disegable / List_background_item_0.xml:

<color xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/list_background_item_0" />
.

res / colore / lista_background_item_0.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/list_background_item_0_pressed"/>
    <item android:color="@color/list_background_item_0_default"/>
</selector>
.

Res / Disegable / List_background_item_1.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/list_background_item_1_pressed" />
    <item android:drawable="@drawable/list_background_item_1_default" />
</selector>
.

RES / Diseggi / List_background_ITEM_1_DEFAULT.XML:

<color xmlns:android="http://schemas.android.com/apk/res/android" 
    android:color="@color/list_background_item_1_default" />
.

RES / Diseggi / List_Background_ITEM_1_press.xml:

<color xmlns:android="http://schemas.android.com/apk/res/android" 
    android:color="@color/list_background_item_1_pressed" />
.

res / valori / colori.xml:

<resources>
    <color name="list_background_item_0_default">#FFCCCC</color>
    <color name="list_background_item_0_pressed">#996666</color>
    <color name="list_background_item_1_default">#CCFFCC</color>
    <color name="list_background_item_1_pressed">#669966</color>
</resources>
.

Elemento dell'elenco 0 è configurato con un ColorDrawable che fa riferimento a ColorStateList e non visualizza un evidenziatore quando premuto. Elenco Articolo 1 è configurato con un StateListDrawable e visualizza l'evidenziazione.

Preferirei piuttosto utilizzare il ColorStateList del StateListDrawable in quanto sembra più pulito e coinvolge un file in meno per tipo di oggetto. C'è qualcosa che ho perso che mi ha permesso di usare questo metodo? Se non è destinato a funzionare come mi aspetto, qualcuno può spiegare perché?

È stato utile?

Soluzione

Grazie a LUKSPROG Commento, ho imparato che i disegni a cui riferimento dal StateListDrawable possono essere colori da colors.xml . Questo rende la soluzione StateListDrawable preferibile alla versione ColorStateList.

La soluzione finale è ...

Metodo getView():

    .
  • Nessuna modifica

res / colore / lista_background_item_0.xml:

    .
  • cancellato

Res / Disegable / List_background_item_0.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/list_background_item_0_pressed" />
    <item android:drawable="@color/list_background_item_0_default" />
</selector>
.

Res / Disegable / List_background_item_1.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/list_background_item_1_pressed" />
    <item android:drawable="@color/list_background_item_1_default" />
</selector>
.

RES / Diseggi / List_background_ITEM_1_DEFAULT.XML:

    .
  • cancellato

RES / Diseggi / List_Background_ITEM_1_press.xml:

    .
  • cancellato

res / valori / colori.xml:

    .
  • Nessuna modifica

Questa soluzione è pulita o più pulita di quanto mi aspettassi che la versione ColorStateList abbia funzionato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top