ArrayAdapter de Listview Arregla () redibujo muy lento de notificydatasetchanged

Tengo una lista bastante simple con 3 campos textview en cada fila. Estamos actualizando sus valores cada 2 segundos o así con los datos procedentes de una llamada de webservice de fondo (AsyncTask)

Comparamos los valores que vienen con los actuales, los actualizamos en consecuencia en el Adaptador y finalmente llamamos a notifyDataSetChanged () si es necesario

La cosa es que el redibujo consigue realmente lento así colgando la UI entera cuando conseguimos más de 3 filas de la actualización inmediatamente. Por supuesto, estamos utilizando todas las optimizaciones bien conocidas ListView como el enfoque EfficientAdapter (setTag () y titulares), y getViewTypecount () / getItemViewType (). También hemos tratado de optimizar nuestra interfaz tanto como sea posible con layoutopt y tratando de evitar wrap_content anchos y alturas para aligerar las cosas.

No realizamos costosas operaciones en nuestras actualizaciones, solo cosas estándar: cambiar los valores de texto TextView, textcolor y backgroundcolor.

Lo único extraño que puedo ver es que getView () se llama 3-4-5 veces por cada fila, aunque he leído todos los mensajes de Romain [1] diciendo que no hay nada malo con eso

¿Alguna idea o sugerencia sobre cómo podemos acelerarlo?

¡Muchas gracias!

[1] http://groups.google.com/group/android-developers/browse_thread/thread/4c4aedde22fe4594/aeb04288064f495e?show_docid=aeb04288064f495e

Esto es para aquellos que navegan desde Google pensando que necesitan para reescribir su propio método de cambio de datos. Basado en mis datos, no es necesario para muchos casos.

notifyDataSetChanged() puede ser MUCHO MÁS RÁPIDO que su reemplazo codificado a mano y todo depende de su implementación real de listview .

Ejemplo: una lista de texto simple de 3 líneas con una fila máxima de 10K ArrayList actualizada mediante la selección del menú.

Manual notifyDataSetChange()

 --- avg run-time: 4ms 

Predeterminado free notifyDataSetChange()

 --- avg run-time: 0ms <--- you can't get faster than this. 

No corra para crear su propio reemplazo a menos que el tiempo y el punto de referencia de sus cosas. Utilice las cosas gratis hasta que sea necesario.

Supongo que puede establecer una etiqueta para ur textView como la url de donde obtendrá la actualización. Y en lugar de llamar a "notifyDataSetChanged ()", puede intentar usar findViewByTag (URL de actualización) y setText para esa vista, por lo que la vista de texto sólo se repinta no toda la lista una y otra vez. Se reduciría suficientemente el número de repintados extra. Solo un pensamiento.

  • Qué orden de diseños anidados es más eficiente en Android
  • Disminuir la velocidad de View Pager en android
  • Android - GC_FOR_ALLOC liberado 6346K, 7% gratis, pausado 143ms, total 143ms
  • Vista de desplazamiento en dos direcciones (en diagonal) como en la aplicación Google Sheets de Google android
  • Enviar eficientemente int a través de sockets en Java
  • HttpClient ejecución de HttpPost significativamente más lento en Android 3.2 que 2.3.3
  • ¿Gradle escala de rendimiento bien con el número de núcleos de la CPU
  • Android - E / Surface: queueBuffer: buffer de cola de errores en SurfaceTexture, -22 crash
  • ¿Es crucial para el rendimiento tener ViewHolder como estática en un patrón de ViewHolder?
  • Mover instancias de Set a otro en Scala
  • ¿Cómo aumentar la velocidad del emulador?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.