2012-09-21 19 views
5

Esta es mi configuración. Tengo un ListView personalizado con algunos encabezados elegantes, que está dentro de un ViewPager. Estoy manteniendo un caché de memoria de imágenes que se han descargado y almacenado localmente como lo haría cualquier desarrollador que se precie.Evite onMeasure y onLayout cada vez que se establece Bitmap ImageView

El problema que estoy teniendo es que cada vez que llamo setImageBitmap(Bitmap bm) en el ImageView en getView() método mis ListView 's, usando un mapa de bits de la memoria caché, que está causando todos mis Vistas a onMeasure(). He mirado a través del código fuente de Android ImageView y encontré esto:

public void setImageDrawable(Drawable drawable) { 
    if (mDrawable != drawable) { 
     mResource = 0; 
     mUri = null; 

     int oldWidth = mDrawableWidth; 
     int oldHeight = mDrawableHeight; 

     updateDrawable(drawable); 

     if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) { 
      requestLayout(); 
     } 
     invalidate(); 
    } 
} 

Así que puedo ver que setImageDrawable (que es llamada por setImageBitmap) Pide a su disposición siempre que el drawable tiene diferentes dimensiones de su anterior Drawable. El problema es que mi ImageView está configurado como estático a 60dp x 60dp, por lo que su tamaño no va a cambiar independientemente del tamaño de su imagen.

¿Hay alguna manera de evitar los diseños constantemente medidos mientras me desplazo? Las llamadas onMeasure y onLayout se propagan por el árbol View, por lo que mis ListView y ViewPager también se están midiendo en el medio del desplazamiento de la lista, lo que obviamente está causando problemas graves de rendimiento (~ 100ms UI saltos).

El rendimiento es horrible y necesito corregirlo. Alguien tiene alguna solución?

Gracias.

+0

¿te importa compartir cómo lo arreglaste? – Dbl

Respuesta

2

Ha pasado un tiempo pero tengo un problema similar recientemente, una fila en la altura de mi listview ha cambiado demasiado, haciendo que se llame a listview.onmeasure.

Si está compilado contra API-14 y superior, puede establecer un punto de interrupción en el código fuente del SDK. eso debería ayudar a descubrir por qué se cambia la altura.

Cuestiones relacionadas