Foros       Consigue tu camiseta aquí
Cambiar el color de las filas de un ListView

 
Publicar Nuevo Tema   Responder al Tema    Índice del Foro www.Android-Spa.com -> Problemas programando en Android
Mostrar mensajes anteriores:   

Lu

Mensajes: 464
MensajePublicado: Sab May 23, 2009 3:20 pm    Título del mensaje: Cambiar el color de las filas de un ListView Enviar mensaje privado Responder citando

Hola!

¿Sabéis alguno cambiarle el color de fondo a las filas de una ListView? En mi lista se muestran items que pueden ser de 3 tipos, entonces dependiendo del tipo de cada uno quiero ponerles un color u otro a la fila.
Cada una de mis filas es un linearLayout con esta estructura:

Código :
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:paddingTop="4dip"
     android:paddingBottom="6dip"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">
 
     <TextView android:id="@+id/text1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:paddingRight="10dip"
         />        
 
     <TextView android:id="@+id/text2"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content" android:layout_weight="1"
         android:textAppearance="?android:attr/textAppearanceMedium"
         />
 
</LinearLayout>


Primero lo que hago es rellenar la lista con un SimpleCursorAdapter, y luego lo que pretendo es recorrer las filas, comprobar el tipo de item y ponerles el color que sea. Lo que no sé es como obtener esas filas para cambiarles el color... Probé con this.getListView().getItemAtPosition(index), pero eso requiere un casting y no sé muy bien de qué clase. Solo no da ClassCastException si el casting es a la clase Cursor, pero con esto no obtengo lo que es el elemento fila para cambiarle el color... No sé, no entiendo, ayuda plis.


Saludos

lancelot

Mensajes: 6438
MensajePublicado: Sab May 23, 2009 3:40 pm    Título del mensaje: Enviar mensaje privado Responder citando

Entiendo lo que quieres hacer pero no sé como lo tienes desarrollado hasta este punto.

Si que se pueden asignar colores a diferentes filas, siempre y cuando especifiques un layout diferente para cada fila. El color va implícito en el layout que le asignes.

Yo para poner colores a toda la fila uso el background. Si no sabes como especificar un layout distinto a cada fila de un listview eso ya tiene más trabajo, y habría que mirarlo despacio.

Saludos.

Lu

Mensajes: 464
MensajePublicado: Sab May 23, 2009 4:00 pm    Título del mensaje: Enviar mensaje privado Responder citando

No sé si servirá, pero posteo la parte esta de codigo:

Código :
    private void fillData()
    {         
        deliveriesCursor = bd.fetchAllDeliveriesList();
        startManagingCursor(deliveriesCursor);     
       
        // Create an array to specify the fields we want to display in the list (only TITLE)
        String[] from = new String[]{BD.KEY_DELIVERY_CODE, BD.KEY_CLIENT};
       
        // and an array of the fields we want to bind those fields to (in this case just text1)
        int[] to = new int[]{R.id.text1, R.id.text2};
       
        // Now create a simple cursor adapter and set it to display
        SimpleCursorAdapter delivs = new SimpleCursorAdapter(this, R.layout.row, deliveriesCursor, from, to);
        setListAdapter(delivs);
        this.getListView().setSelection(Integer.parseInt(String.valueOf(index)));
       
        setRowColor(deliveriesCursor);
    }   
   
    private void setRowColor (Cursor c)
    {
        if (c!= null)
        {
            c.moveToFirst();
            int index = 0;
            while (c.moveToNext())
            {              
                int state = Integer.parseInt(c.getString(3));
               
                switch (state)
                {
                    case 1:
                        View rowt1= (View) this.getListView().getItemAtPosition(index);
                 rowt1.setBackgroundColor(Color.GREEN);
                       
                        break;
                    case 2:
                        View rowt2= (View) this.getListView().getItemAtPosition(index);
                        rowt2.setBackgroundColor(Color.RED);
                        break;
                }
                index ++;
            }
        }
    }



El problema viene en el switch este de abajo, eso es lo que explicaba del ClassCastException en el getItemAtPosition.

Con lo de diferentes layouts para las filas...te refieres a un xml para cada fila? Sé que no te referirás a eso, pero no entiendo entonces.

Gracias por la ayuda. Voy a seguir googleandolo a ver si lo saco.

Saludos

javiel

Mensajes: 361
MensajePublicado: Sab May 23, 2009 6:04 pm    Título del mensaje: ... Enviar mensaje privado Responder citando

Perdon que me meta, pero es que tengo un problema que también va por el tema de los background en las listas

Yo tengo una lista con dos layout: una para la lista y otro para cada una de las filas.

La cosa es que el layout principal (que contiene el listview) tiene una imagen de fondo. La cosa es que cuando tengo muchas filas si arrastro para ir bajando, durante el proceso de bajar el fondo de pone negro y al soltar se pone de nuevo la imagen de fondo

No tengo ni idea que pasa, no se si es que se quita el color de fondo o se activa otro fondo de algo. No se

¿alguien sabe algo?

Para solicionar el tema de Lu creo que deberías de usar un Adapter y ahí ir cambiando el color de la fila según el tipo que sea

un saludo

javiel

Mensajes: 361
MensajePublicado: Sab May 23, 2009 6:17 pm    Título del mensaje: ... Enviar mensaje privado Responder citando

he resuelto mi problema. Siento haberme metido así como así pero estaba volviendome loco. Lo he encontrado por casualidad. Si son pasa sólo tenéis que poner en el XML del listview

android:cacheColorHint="#00000000"

Saludos

lancelot

Mensajes: 6438
MensajePublicado: Sab May 23, 2009 6:37 pm    Título del mensaje: Enviar mensaje privado Responder citando

Javiel nunca había hecho nada así por lo que no había visto ese fallo, la línea que indicas sabes exactamente que hace?..

Lu, para hacer lo que quieres yo utilizaría el siguiente método.

La clase principal extendería así "extends ListActivity", y luego crearía otra clase para crear tu propio Adapter, "extends BaseAdapter". Dentro de esta última clase tienes el siguiente método

public View getView(int position, View convertView, ViewGroup parent) {

Aquí eliges el tipo de layout que le das a cada una de las filas, es entonces cuando podrías elegir otro layout con otro color de fondo.

No sé si me he explicado bien, es que hay muchas maneras de hacer un listView, muchas combinaciones y no todas sirven para lo que quieres.

Saludos.

javiel

Mensajes: 361
MensajePublicado: Sab May 23, 2009 7:21 pm    Título del mensaje: ... Enviar mensaje privado Responder citando

Lu, en mi programa NadaList, que puedes descargar aquí, tienes un ejemplo de Adapter bastante sencillo. La clase se llama "RowNoteAdapter.java"

El programa tiene algunas fallos, pero te servirá para ver como va el tema del Adapter

Respecto a la línea, a mi me pasaba que cuando me movía por un ListView, por ejemplo tengo más filas de las que caben en pantalla y quiero moverme hacia abajo, como tengo una imagen de fondo, el fondo se me ponía negro. Nunca lo había notado ya que siempre uso los fondos en negro, pero ahora que he puesto una imagen se ve muy raro

No se si es un fallo, pero queda fatal. Parece que lo hace para optimizar el movimiento o algo así. Lo explican aquí

Si le pones eso parece que usa como color el transparente y ya no pasa

No lo entiendo demasiado bien, pero parece algo de eso

Un saludo

Lu

Mensajes: 464
MensajePublicado: Sab May 23, 2009 11:32 pm    Título del mensaje: Enviar mensaje privado Responder citando

Gracias por la ayuda chicos, me pongo manos a la obra con la nueva clase del Adapter como me habéis explicado. Y javiel, tranquilo por lo de preguntar en mi hilo. Como más o menos el problema iba de lo mismo así no hay tantos hilos desperdigados y con un solo hilo matamos dos pajaros de un tiro Smile

Saludos

Lu

Mensajes: 464
MensajePublicado: Lun May 25, 2009 6:11 pm    Título del mensaje: Enviar mensaje privado Responder citando

Oyes, que me he puesto manos a la obra peroooo...que la obra está aún sin acabar. A ver, hice lo que me dijisteis y ya consigo ponerle colorines a las filas. Entonces, le he puesto también un listener para detectar cuando una fila del ListView está seleccionada, y de esta forma ponerle el color transparente para que se vea el foco. Ahora el problema que tengo es como detectar cuando se deselecciona una fila para volverle a poner el color. ¿Se puede detectar cuando una fila ha dejado de estar seleccionada?

Voy a seguir googleando pero si alguien lo sabe, pues mejor, asi no pierdo más tiempo, que ayer estuve todo el dia con esto y esta noche hasta he soñado con las filas naranjas y verdes y rojas.... X_X

Saludos Smile

lancelot

Mensajes: 6438
MensajePublicado: Lun May 25, 2009 7:12 pm    Título del mensaje: Enviar mensaje privado Responder citando

La verdad es que no lo sé, pero se me ocurre que guardes la fila que está seleccionado y si haces clic en otra fila, primero comprobar cual estaba pinchada antes, y si son distintas primero devuelves el color a la antigua y luego pones el foco a la nueva.

No sé si esto funcionaría...

Saludos.

Lu

Mensajes: 464
MensajePublicado: Lun May 25, 2009 10:42 pm    Título del mensaje: Enviar mensaje privado Responder citando

Uops, te me adelantaste. Venia a contaros que al final eso fue lo que hice porque no encontraba lo de la fila que dejaba de estar seleccionada, y que sí que funciona. Hombre, no queda tan "bonito" como con el foco original porque el color se ve plano y el foco original hacia sombritas... y tambien he notado que va mas lento el movimiento de una fila a otra de esta manera, pero es lo mejor que he podido sacar.

Mañana cuando pueda cuento mejor como lo he hecho, posteando código y eso por si alguna vez alguien más lo necesita Smile

Saludos Smile

Lu

Mensajes: 464
MensajePublicado: Mie May 27, 2009 6:20 pm    Título del mensaje: Enviar mensaje privado Responder citando

ARRRRGHHH!!!! llevaba ya un rato contanto como hice lo de cambiarle el color a las filas del listview y lo he perdido todo, que rabia!!

Empiezo otra vez. Resumo: tengo una actividad que extiende de ListActivity que será la pantalla que muestra la lista. Cada item de la lista tiene un estado del cual dependerá el color de la fila. Entonces, con un cursor recupero de la base de datos los items que quiero mostrar. Entre los campos recuperados está el campo del estado que ya he comentado antes. Me creo una clase nueva llamada por ejemplo CustomAdapter que extiende de BaseAdapter. Lo importante en esta clase es el método getView que por lo visto es el que se llama cada vez que se va a pintar una fila por pantalla. En este método llamo a la clase CustomAdapterView que es la que construye lo que es la vista de la fila. En esta clase le cambiamos el color, incluimos los strings a mostrar, tamaño, etc. Y luego tenemos un listener en la Activity que extiende de listactivity para detectar cuando una fila ha sido seleccionada. Guardamos el color que tiene y la vista de esta fila, y luego le cambiamos el color de forma que ese color será como el foco (yo se lo he puesto azul) y a la fila que ha dejado de estar seleccionada le restauramos sus valores. Vale que mas... no sé, bueno, posteo parte del codigo con comentarios para que se entienda mejor.

En la clase Activity que extiende de ListActivity:



Código :
    //Metodo que "rellena" la listView con items
    private void fillData()
    {         
        deliveriesCursor = bd.fetchAllDeliveriesList();
        startManagingCursor(deliveriesCursor);
       
        delivs = new CustomAdapter(this, deliveriesCursor);
   
        setListAdapter(delivs);
        //Este index es la posicion de la fila seleccionada, lo uso para que se mantenga si
        //el foco en la misma fila si se hace un cambio de orientacion por ejemplo.
        this.getListView().setSelection(Integer.parseInt(String.valueOf(index)));   
       
        this.getListView().setOnItemSelectedListener(onItemSelectedListener);
   
    }      
   
    OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener()
    {      
       
        @Override
        public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
            //prevView es de tipo View y prevColor es de tipo Drawable. Son variables globales de la clase, atributos.
           
           
            if (prevView != null)
                prevView.setBackgroundDrawable(prevColor);
                                   
            prevView = v;
            prevColor = v.getBackground();         
       
            v.setBackgroundColor(Color.BLUE);          
        }

        //Este metodo se llama cuando entramos en touchMode de forma que ya no habria ningún foco
        //entonces para que no se quede ninguna fila azul, pues a la ultima fila seleccionada antes
        //de entrar en este modo le restauramos su color.
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            if (prevView != null)   
                prevView.setBackgroundDrawable(prevColor)
        }
    };




Y esto va en la clase CustomAdapter que extiende de BaseAdapter:


Código :


    @Override
    public View getView(int position, View contentView, ViewGroup parent) {
         Delivery d = dList.get(position);
         return new CustomAdapterView(this.context, d, position );
    }
   
   
    //Obtenemos un color u otro segun el estado del item
    public int getColor (String state, int position )
    {
        int color;         
       
        if (state.equalsIgnoreCase("1"))
            color = Color.rgb(90, 238, 90);     // GREEN
        else if (state.equalsIgnoreCase("2"))
            color = Color.rgb(248, 89, 89);     // RED
        else
        {
            if ( position%2 == 0 )
                color = Color.rgb(230, 230, 250);   // GREY
            else
                color = Color.WHITE;               
        }
        return color;
    }

    class CustomAdapterView extends LinearLayout {        
        public CustomAdapterView(Context context, Delivery d, int position) {
            super( context );      
                   
            // Ponemos el color de la fila
            this.setBackgroundColor(getColor(d.getState(), position));
           
            //Yo en cada fila muestro dos strings: codigo y cliente.
           
            TextView codeTW = new TextView( context );
            codeTW.setText( d.getDelivCode() );         
            codeTW.setTextAppearance(context, android.R.style.TextAppearance_Medium);        
            codeTW.setPadding(0, 0, 10, 0);         
           
            //Este codigo lo que hace es que como mi color de foco era azul oscuro y las letras negras
            //no se ven bien, pues con esto las letras serán blancas cuando la fila esté seleccionada
            //y seran negras cuando no lo esté.
            codeTW.setTextColor(new ColorStateList(
                     new int[][] { new int[] { android.R.attr.state_selected }, new int[0] },
                     new int[] { Color.WHITE, Color.BLACK }
                     ));           
                 
            TextView clientTW = new TextView(context);                
            clientTW.setText( d.getClient() );
            clientTW.setTextAppearance(context, android.R.style.TextAppearance_Medium);  
            clientTW.setTextColor(new ColorStateList(
                     new int[][] { new int[] { android.R.attr.state_selected }, new int[0] },
                     new int[] { Color.WHITE, Color.BLACK }
                     
                     ));
            addView(codeTW);
            addView(clientTW);
                 
           
        }
    }



Y nada más, espero que se entienda bien.

Saludos Smile

Publicar Nuevo Tema   Responder al Tema    Índice del Foro www.Android-Spa.com -> Problemas programando en Android Todas las horas están en GMT + 2 Horas
Página 1 de 1
Ver tema anterior :: Ver siguiente tema  

 
Saltar a:  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas