Home Menu

Menu



Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android


 
Herramientas
  #1  
Viejo 04/08/16, 10:30:07
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
Problema con ViewHolder

Vereis, tengo un problema con una lista y el patron ViewHolder, es el tipico problema de que al hacer scroll se desmonta todo y no me mantiene las posiciones de algunos elementos, por ejemplo, al pulsar un item de la lista me cambie el color del texto y se mantenga al hacer scroll, he conseguido cambiar el color del texto pero se me cambia en otros elementos tambien, en definitiva...que no se como mantener las views de cada elemento.
Responder Con Cita


  #2  
Viejo 04/08/16, 10:41:30
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Cada vez que recicles (reutilices) un elemento de vista tienes que establecer TODOS los atributos que pueden cambiar de un elemento de la lista al otro.

O cambias todos los atributos o te puedes encontrar con valores que no son los que esperabas porque se cambiaron.
Responder Con Cita
  #3  
Viejo 04/08/16, 10:55:08
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
Eso es precisamente lo que no consigo hacer mocelet, este es el codigo del adapter, me funciona bien, lo unico que al pulsar el elemento no me mantiene las posiciones

Código:
public class AdapterServeri extends ArrayAdapter<String> {

   private Context context;
   private int[] nombre;
   private String[] frase;

 

   public AdapterServeri(Context context, int[] nombre, String[] frase) {
        super(context, R.layout.adapter_doble,frase);
        this.nombre = nombre;
        this.frase = frase;
        this.context = context;
    } 
   
   @Override
public long getItemId(int position) {
        return position;}

    @Override
public int getViewTypeCount() {
        return getCount();
    }

    @Override
public int getItemViewType(int position) {
        return position;
    }

    private class ViewHolder {
        TextView nombre;
        TextView frase;        
    }
  
    @Override  
public View getView(final int position, View convertView, ViewGroup parent) {

        final ViewHolder holder;
        if (convertView == null) {

            LayoutInflater inflater = LayoutInflater.from(context);  
            convertView = inflater.inflate(R.layout.adapter_doble, null);            
            holder = new ViewHolder();
            holder.n = (TextView) convertView.findViewById(R.id.personaje);
            holder.f = (TextView) convertView.findViewById(R.id.frase);

            convertView.setTag(holder);
            
        } else {  
            holder = (ViewHolder) convertView.getTag();
        }

        final String temp = getItem(position);
        holder.n.setText(nombre[position]);
        holder.f.setText(frase[position]);
       
        return convertView;  
    }

}
Responder Con Cita
  #4  
Viejo 04/08/16, 11:16:18
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Ese código que has puesto solo es para actualizar el texto del nombre y la frase. No veo que establezcas el color del texto en ningún sitio si es algo que puede cambiar de un elemento a otro.

Si lo que haces al hacer una pulsación es cambiar "a pelo" el color de la view, mal. Porque al hacer scroll la view pertenecerá a otro item de la lista y estará con un color que no corresponde.

Todos los atributos que puedan cambiar, TODOS, tienes que establecerlos en el adapter. Y en vez de cambiar directamente la vista cambias el modelo y llamas onNotifyDataSetChanged() para que la lista se actualice. Para eso necesitarás un color[position] por ejemplo, igual que haces con el nombre o la frase.
Responder Con Cita
  #5  
Viejo 04/08/16, 11:56:51
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
Creo que ya lo solucione, ya me cambia el color del texto correctamente y me mantiene por ejemplo el estado de los checkbox, imagenes etc, Aqui encontre una de las soluciones, y aparte cambie algunas lineas en el getView del adapter.

Con esto se me soluciono.

View v = convertView;
ViewHolder holder;
Responder Con Cita
  #6  
Viejo 04/08/16, 12:25:19
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Si se te ha solucionado bien, aunque la solución que enlazas en cuanto hagas scroll y se recicle alguna view va a volver a estar todo patas arriba porque cambias las propiedades de views directamente.
Responder Con Cita
  #7  
Viejo 04/08/16, 18:58:04
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
Del enlace solo he cogido la solucion para el "setOnItemClickListener" para cambiar el color de los textos al pulsar, hago scroll y va perfecto, no me descontrola nada
Responder Con Cita
Respuesta

Estás aquí
Regresar   HTCMania > Todo sobre Android > Programación y Desarrollo para Android


Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 13:21:09 (GMT +1)

Cookies
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007