Ver la Versión Completa : Problema con ViewHolder
kaiser75
04/08/16, 10:30:07
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.
mocelet
04/08/16, 10:41:30
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.
kaiser75
04/08/16, 10:55:08
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 :rolleyes:
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;
}
}
mocelet
04/08/16, 11:16:18
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.
kaiser75
04/08/16, 11:56:51
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 (http://stackoverflow.com/questions/22862098/how-to-change-color-of-text-when-click-in-base-adapter-in-android), y aparte cambie algunas lineas en el getView del adapter.
Con esto se me soluciono.
View v = convertView;
ViewHolder holder;
mocelet
04/08/16, 12:25:19
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.
kaiser75
04/08/16, 18:58:04
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 :ok:
vBulletin® v3.8.1, Copyright ©2000-2026, Jelsoft Enterprises Ltd.