2010-01-12 24 views
7

ich eine Listenansicht und einen Adapter verwenden, abwechselnd Hintergrundfarben auf die Listenelemente setzt („Zebra“ Listenstil):Listenelemente mit wechselnden Farben

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

Aber jetzt, wenn ich einen Gegenstand mit Scroll wählen oder wenn ich auf ein Element klicke, überschreiben die ursprünglichen Farben zum Auswählen/Klicken nicht meine benutzerdefinierten Hintergründe (ich kann die Originalfarbe unter der von mir eingestellten sehen).

Wie kann ich die Originalfarben für diese Zustände einstellen?

Antwort

20

ich denke, der einfachste Weg, zwei Selektoren zu schaffen, die als Hintergrund-Ressourcen, mit transparenter Farbe im state_selected-Modus verwendet werden: (res/ziehbar/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/ziehbar/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/Werte/Colors.xml :)

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

Dann legen Sie die Hintergründe in die Methode getView des Adapters mit der Methode setBackgroundResource:

Wenn Sie nun eine Zeile auswählen, wird der ursprüngliche Auswahlbereich nicht von Ihrem Hintergrund ausgeblendet.

+0

Dies funktioniert teilweise - ich kann die Hervorhebung sehen, wenn das Objekt mit der Scroll-Taste fokussiert wird, aber ich kann es nicht ausführen, wenn das Objekt gedrückt wird. Ich habe alle hier aufgeführten Zustände versucht: http://developer.android.com/guide/topics/resources/color-list-resource.html, aber nichts hat funktioniert ... – zorglub76

+1

Ich habe die Selektoren bearbeitet, um auch den gedrückten Zustand zu handhaben . Es scheint so, als wenn du den Gegenstand drückst, verliert er seinen gewählten Zustand. Sie müssen also den gedrückten Zustand auch als transparent definieren. Achten Sie nur auf die Reihenfolge, da der Selektor das erste Element verwendet, das dem aktuellen Status entspricht. Daher sollte der Wert state_selected = "false" ganz unten sein. – Utyi

+0

Funktioniert! Fast ein Jahr seit ich diese Frage gestellt habe !! Vielen Dank! – zorglub76

2

Sie benötigen Liste Highlight-Farbe ändern, wenn Sie es über Arten tun

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

oder Sie gleiche Attribut in Code festlegen my_selector ein Zustand ziehbar ist - siehe Beispiele im SDK-Verzeichnis:

<?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

Ich habe das versucht, aber was auch immer ich für den Hintergrund zuerst eingestellt habe, wird durch das Erstellen von "Zebra" im Code nach ... überschrieben. Gibt es eine andere Möglichkeit, Zebra-Look zu erstellen? – zorglub76