2010-01-12 9 views
7

que tengo una vista de lista y un adaptador que establece alternando los colores de fondo a los elementos de la lista (estilo de lista "cebra"):Lista de artículos con colores alternados

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

Pero ahora, cuando seleccione un elemento mediante desplazamiento rueda, o cuando hago clic en un elemento, los colores originales para seleccionar/hacer clic no anulan mis fondos personalizados (puedo ver el color original debajo del que configuré).

¿Cómo puedo establecer los colores originales para estos estados?

Respuesta

20

creo que la forma más fácil es crear dos selectores que se utilizan como los recursos del fondo, con el color transparente en el modo de STATE_SELECTED: (res/estirable/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/estirable/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> 

(/ valores/colors.xml res :)

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

A continuación se establecen los fondos en el método getView del adaptador con el método setBackgroundResource:

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

Ahora cuando selecciona una fila, su fondo no oculta el selector original.

+0

Esto funciona parcialmente: puedo ver resaltar cuando el elemento se enfoca usando el botón de desplazamiento, pero no puedo hacer que funcione cuando se presiona el elemento. Intenté todos los estados enumerados aquí: http://developer.android.com/guide/topics/resources/color-list-resource.html, pero nada funcionó ... – zorglub76

+1

He editado los selectores para manejar el estado presionado también . Parece que cuando presionas el elemento, pierde su estado seleccionado. Entonces, debe definir el estado presionado para que sea transparente también. Solo tenga cuidado con el pedido, ya que el selector usará el primer elemento que coincida con el estado actual, por lo que el elemento state_selected = "false" debe estar en la parte inferior. – Utyi

+0

¡Funciona! ¡Hace casi un año que hice esta pregunta! ¡Gracias! – zorglub76

2

necesita cambiar su lista de color de realce si lo haces a través de estilos

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

o puede establecer mismo atributo en el código my_selector es un estado dibujable - buscar ejemplos en el directorio 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

Lo intenté, pero cualquier cosa que establezca para el fondo al principio, queda anulada al crear "cebra" en el código después de ... ¿Hay alguna otra manera de crear un look de cebra? – zorglub76

Cuestiones relacionadas