bastante nuevo desarrollador de Android aquí.getView llamado con la posición incorrecta al desplazarse rápidamente
Me he encontrado con un problema extraño que no estoy seguro de cómo solucionarlo. He leído muchos problemas por aquí que parecen ser el mismo problema que tengo, pero las soluciones a sus problemas nunca parecían aplicables a lo que está sucediendo aquí.
Tengo una vista de lista personalizada configurada usando una clase separada que amplía BaseAdapter y usa un titular de vista (configuré esto mirando varios ejemplos diferentes de listas de visitas personalizadas). Tiene una vista de texto, un botón, una barra de progreso y un botón de imagen, y estos elementos están ocultos/cambiados según una AsyncTask utilizada para descargar un archivo.
Todo funciona bien cuando me desplazo lentamente por la lista. Cuando desplazo la lista rápidamente arriba/abajo, es como si las vistas de algunas celdas de la lista se reasignaran a otras celdas.
Puedo poner esta línea en la parte superior de mi método "getView" en mi clase de adaptador:
@Override
public View getView(final int pos, View convertView, ViewGroup parent)
{
Log.i("ks3","getView called, position is " + pos);
tengo 7 artículos en mi lista, y 6 de ellos caben en la pantalla. Cuando por primera vez se muestra, veo esto en mi registro:
getView called, position is 0
getView called, position is 1
getView called, position is 2
getView called, position is 3
getView called, position is 4
getView called, position is 5
cuando me desplazo hacia abajo lentamente hasta el siguiente elemento, este se imprime siguiente:
getView called, position is 6
cuando me desplazo hacia arriba, esta :
getView called, position is 0
Bajar y subir lentamente producen estos resultados sin problemas.
Cuando inicio el desplazamiento de ida y vuelta rápida, imprime este mensaje un montón de veces, sobre todo mostrando 6 y 0 como la posición, pero de vez en cuando los verán así:
getView called, position is 1
getView called, position is 5
Las posiciones 1 y 5 no deberían ser llamados, ya que siempre están en pantalla. Es como si getView tuviera todo revuelto. Al mismo tiempo, como dije antes, mi lista se verá extraña. Los botones de imagen se moverán hacia arriba o hacia abajo en una celda donde no deberían estar.
Si vuelvo a desplazarme suavemente, solo veo 0 y 6 para la posición nuevamente.
Honestamente, no estoy seguro de cómo solucionar esto. Pensé que tal vez podría limitar la velocidad con la que puedes desplazarte por la lista, pero no he podido encontrar nada que funcione.
Gracias!
Editar: Quería actualizar un par de cosas con respecto a esta pregunta. La primera es que, a partir de un comentario aquí y del video de Google en listView, me ha llamado la atención que se pueda llamar a getView para otras cosas, luego de lo que imaginé que era, como mediciones, y por eso no debería alarmarme. por lo que originalmente pensé que era parte de mi problema (que era que creía que se llamaba a getView con las posiciones incorrectas).
En segundo lugar, vi varias veces que es una muy mala idea "almacenar en caché las vistas dentro de su adaptador". No estoy exactamente claro en lo que esto significa, pero estoy bastante seguro de que es una de las cosas que estoy haciendo mal (guardo una instancia de un botón, progressBar, imageButton ...).
Eso, junto con el hecho de que actualizo las vistas fuera de getView y no utilizo notifyDataSetChanged(); los que están juntos probablemente estén causando algunas cosas inseguras.
A menos que su ListView personalizado esté haciendo algo funky, esto suena como un problema de reciclaje, publique su código getView() completo. – dmon
Si no encuentra ningún error en su código y utiliza Honeycomb o superior, puede intentar deshabilitar la aceleración de hardware para el diseño de su lista. La aceleración de hardware puede causar tales errores. – zapl
Parece un problema de reciclaje. Voy a echar un vistazo al video de Google en listViews y ver si hay algún problema evidente con mi uso de listView. – Droidmon