2012-07-25 22 views
5

Qué está pasando: Las dos primeras páginas de ViewPager se cargan muy bien (ViewPager carga automáticamente + -1 desde la página actual). Cuando pasa de un lado a otro, las siguientes páginas no aparecen. Demostración GIF del problema a continuación.ViewPager + PagerAdapter muestra páginas en blanco después de los dos primeros elementos

información de depuración: Las páginas son se crea una instancia (ver código de abajo) y se añaden con éxito a la ViewPager ArrayList<ItemInfo>mItems (confirmado a través de mensajes de registro). Me recompilado la biblioteca android.support.v4 con debug = conjunto verdadero (mmm frameworks/support/v4/ en AOSP) y se nota que todo funcione perfectamente SALVO:

Los métodos OnLayout y onMeasure en ViewPager dejan de ser llamado después de los primeros dos puntos de vista se cargan. Esto significa que las otras páginas son negras porque nunca se midieron & dispuestas como deberían haber sido. Traté de agregar diferentes llamadas requestLayout() en diferentes puntos para forzar una actualización del árbol de diseño en vano.

Antecedentes: Tengo un ViewPager instanciado a través de inflater.inflate y encontrado a través de view.findViewById (R.layouy.myid). Que está reemplazando directamente un viejo Vista de la galería, y para fines de prueba del PagerAdapter instantiateItem (recogida, posición) simplemente hace esto:

@Override 
public Object instantiateItem(View collection, final int position) { 
    final TextView tv = new TextView(collection.getContext()); 
    tv.setText("Looking at page " + position); 
    tv.setTextColor(Color.WHITE); 
    tv.setBackgroundColor(Color.rgb((int)(Math.random()*100), (int)(Math.random()*100), (int)(Math.random()*100))); 
    tv.setTextSize(22); 
    ((ViewPager) collection).addView(tv); 
    return tv; 
} 

¿Alguna idea? Me parece que algunos misterios en los padres de PageView están deshabilitando de alguna manera en el diseño PageView

+1

[Demo GIF del problema (imgur)] (http://i.stack.imgur.com/YPsJr.gif) –

+0

¿implementó 'destroyItem' en su adaptador? http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#destroyItem(android.view.ViewGroup, int, java.lang.Object) –

+0

Sí, exactamente como se recomienda: 'destroyItem (Ver c, int p, Objeto v) {((ViewPager) c). Eliminar Vista ((Ver) v); } 'y funciona perfectamente en mi aplicación de prueba. –

Respuesta

9

Encontré mi problema. En el padre del padre de mi vista, alguien subclasificó LinearLayout y anuló requestLayout() sin llamar al super.requestLayout().

Esto rompió la actualización de mi jerarquía de vistas y evitó que onMeasure y onLayout se llamaran en mi ViewPager. Sin medir y diseñar las páginas, aparecieron en blanco en ViewPager.

Espero que esto ayude a alguien más a salir algún día. Definitivamente me tomó mucho tiempo resolverlo.

PRO TIP: android-sdk/herramientas/hierarchyviewer es increíble . Gracias, equipo de Android. Todos deberían ejecutarlo al menos una vez, puede ser invaluable en la depuración y el diseño de cualquier UI.

+0

¿no está desaprobado el monitor ahora? –

+0

La versión de línea de comandos es, pero la versión de Android Device Monitor no lo es. – Neeeko

Cuestiones relacionadas