2010-01-12 6 views
7

j'ai une vue liste et un adaptateur qui définit en alternance des couleurs d'arrière-plan aux éléments de liste (style de liste « zèbre »):Liste des articles avec des couleurs alternées

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

Mais maintenant, quand je sélectionne un élément à l'aide de défilement ou lorsque je clique sur un élément, les couleurs d'origine pour la sélection/le clic ne remplacent pas mes arrière-plans personnalisés (je peux voir la couleur d'origine en dessous de celle que j'ai définie).

Comment puis-je définir les couleurs d'origine pour ces états?

Répondre

20

Je pense que la meilleure façon est de créer deux sélecteurs qui sont utilisés comme ressources de fond, la couleur transparente en mode 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/valeurs/Colors.xml :)

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

Ensuite, vous définissez les arrière-plans en la méthode getView de l'adaptateur avec la méthode setBackgroundResource:

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

Maintenant, lorsque vous sélectionnez une ligne, votre arrière-plan ne cache pas le sélecteur d'origine derrière.

+0

Cela fonctionne partiellement - je peux voir en surbrillance lorsque l'élément est focalisé en utilisant le bouton de défilement, mais je ne peux pas le faire fonctionner lorsque l'élément est pressé. J'ai essayé tous les états énumérés ici: http://developer.android.com/guide/topics/resources/color-list-resource.html, mais rien n'a fonctionné ... – zorglub76

+1

J'ai édité les sélecteurs pour manipuler l'état pressé aussi . Il semble que lorsque vous appuyez sur l'élément, il perd son état sélectionné. Donc, vous devez définir l'état pressé pour être transparent aussi. Faites attention à la commande, car le sélecteur utilisera le premier élément qui correspond à l'état actuel, donc l'élément state_selected = "false" devrait être en bas. – Utyi

+0

Fonctionne! Presque un an depuis que j'ai posé cette question !! Merci! – zorglub76

2

Vous devez changer votre liste couleur de surbrillance si vous le faites par styles

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

ou vous pouvez définir même attribut dans le code my_selector est un état drawable - chercher des exemples dans le répertoire 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

J'ai essayé cela, mais tout ce que je définis pour l'arrière-plan au premier abord, est remplacé en créant "zèbre" dans le code après ... Y at-il une autre façon de créer look zèbre? – zorglub76

Questions connexes