2010-01-12 18 views
7

ho una visione lista e un adattatore che stabilisce alternando i colori di sfondo alle voci di elenco ("zebra" lista di stile):Voci di elenco con i colori alternati

public View getView(final int position, View convertView, ViewGroup parent) { 
    int colorPos = position % colors.length; 
    ... 
    convertView.setBackgroundColor(colors[colorPos]); 
    return convertView; 
} 

Ma ora, quando seleziono un elemento utilizzando scorrimento ruota, o quando clicco su un oggetto, i colori originali per selezionare/fare clic non sovrascrivono i miei sfondi personalizzati (posso vedere il colore originale sotto quello impostato).

Come posso impostare i colori originali per questi stati?

risposta

20

Penso che il modo più semplice è quello di creare due selettori che sono usati come le risorse di fondo, con il colore trasparente in modalità state_selected: (res/drawable/alterselector1.xm l :)

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_selected="true" 
     android:drawable="@drawable/transparent" /> 
    <item android:state_pressed="true" 
     android:drawable="@drawable/transparent" /> 
    <item android:state_selected="false" 
     android:drawable="@drawable/altercolor1"/> 

</selector> 

(res/drawable/alterselector2.xml :)

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_selected="true" 
     android:drawable="@drawable/transparent" /> 
    <item android:state_pressed="true" 
     android:drawable="@drawable/transparent" /> 
    <item android:state_selected="false" 
     android:drawable="@drawable/altercolor2"/> 
</selector> 

(res/valori/colors.xml :)

<resources> 
    <drawable name="transparent">#00ffffff</drawable> 
    <drawable name="altercolor1">#ffffffff</drawable> 
    <drawable name="altercolor2">#ff000000</drawable> 
</resources> 

Poi si impostano gli sfondi in il metodo getView dell'adattatore con il metodo setBackgroundResource:

if (position % 2 == 0){ 
    reusableView.setBackgroundResource(R.drawable.alterselector1); 
} else { 
    reusableView.setBackgroundResource(R.drawable.alterselector2); 
} 

Ora quando selezioni una riga, lo sfondo non nasconde il selettore originale dietro.

+0

Questo funziona parzialmente - Posso vedere l'evidenziazione quando l'oggetto è focalizzato usando il pulsante di scorrimento, ma non riesco a farlo funzionare quando si preme un oggetto. Ho provato tutti gli stati elencati qui: http://developer.android.com/guide/topics/resources/color-list-resource.html, ma non ha funzionato ... – zorglub76

+1

Ho modificato i selettori per gestire anche lo stato premuto . Sembra che quando si preme l'elemento, perde lo stato selezionato. Quindi devi definire anche lo stato premuto per essere trasparente. Presta attenzione per l'ordine, perché il selettore utilizzerà il primo elemento che corrisponde allo stato corrente, quindi l'elemento state_selected = "false" dovrebbe essere in fondo. – Utyi

+0

Funziona! Quasi un anno da quando ho fatto questa domanda !! Grazie! – zorglub76

2

è necessario modificare l'elenco punto culminante di colore se lo si fa tramite stili

<style name="Widget.AbsListView"> 
     <item name="android:listSelector">@drawable/my_selector</item> 
</style> 

oppure è possibile impostare lo stesso attributo nel codice my_selector è uno stato disegnabile - cercare esempi nella directory SDK:

<?xml version="1.0" encoding="utf-8"?> 
<!-- Copyright (C) 2008 The Android Open Source Project 

    Licensed under the Apache License, Version 2.0 (the "License"); 
    you may not use this file except in compliance with the License. 
    You may obtain a copy of the License at 

      http://www.apache.org/licenses/LICENSE-2.0 

    Unless required by applicable law or agreed to in writing, software 
    distributed under the License is distributed on an "AS IS" BASIS, 
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    See the License for the specific language governing permissions and 
    limitations under the License. 
--> 

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

    <item android:state_window_focused="false" 
     android:drawable="@color/transparent" /> 

    <!-- 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> 
+0

L'ho provato, ma qualsiasi cosa io abbia impostato per lo sfondo in un primo momento, viene sovrascritta creando "zebra" nel codice dopo ... C'è un altro modo per creare un look zebra? – zorglub76