![]() |
|
| 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 |
«
Tema Anterior
|
Siguiente tema
»
|
|
Herramientas |
|
#1
|
||||
|
||||
|
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.
|
|
|
|
#2
|
||||
|
||||
|
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. |
|
#3
|
||||
|
||||
|
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;
}
}
|
|
#4
|
||||
|
||||
|
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. |
|
#5
|
||||
|
||||
|
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; |
|
#6
|
||||
|
||||
|
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.
|
|
#7
|
||||
|
||||
|
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
|
| Respuesta |
Estás aquí
|
||||||
|
||||||
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 13:21:09 (GMT +1)
HTCMania: líderes desde el 2007






