2012-04-05 21 views
9

Estamos tratando de crear una aplicación de Android que se base en ViewPager y que reciba durante las instrucciones de tiempo de ejecución para agregar y eliminar páginas. Casi como una experiencia de navegador con pestañas, puede eliminar la pestaña actual o eliminar una pestaña específica.Destruir páginas en ViewPager y FragmentStatePagerAdapter

Según la documentación de Google, usamos FragmentStatePagerAdapter, que está destinado a usarse en situaciones en las que hay un gran número de páginas, trabajando más como una vista de lista.

Pero cuando tratamos de: - Eliminar una página que no está en la pantalla - y crear un nuevo objeto fragmento de la misma clase - y en la misma posición de la página eliminado nos dimos cuenta de que el androide plataforma recuperar la página muerta y mostrar eso al usuario. El nuevo objeto que acabamos de crear simplemente no ejecuta "onCreate", "onCreateView" o "onActivityCreated".

Estamos buscando formas de solucionar este problema forzando a la plataforma a utilizar nuestro nuevo objeto de fragmento de la misma clase. ¿Algunas ideas?

Descubrimos que si destruimos la página actual, la plataforma destruyó la página y creó un nuevo objeto de la misma clase. Aquí hay un pequeño ejemplo que replica el problema y este comportamiento.

Fuente: http://dl.dropbox.com/u/8333012/SimpleAdapter/SimplePager.zip

vídeo: http://www.youtube.com/watch?v=-oaXXwU8PSI&hd=1

De este proyecto cuando se toca la TextView en la primera página que fue diseñado para eliminar la segunda página (que es de color verde) a una nueva página azul. Verá que incluso al hacer eso desde la primera página, la segunda página permanece verde. Pero cuando presiona el botón Atrás de Android en la segunda página (verde) y toca TextView, la segunda página creada tendrá el color azul correcto.

Respuesta

13

Cuando trabaje con ListView y cambie los datos subyacentes de su adaptador, llame al notifyDataSetChanged() y cualquier Vista que refleje el conjunto de datos se actualizará. Esa es la forma en que debería ir con el adaptador de fragger pager también.

En su caso, no notifica al adaptador. Sin embargo, en el caso de FragmentPagerAdapter/FragmentStatePagerAdapter, no hace la diferencia porque esos adaptadores ignoran notifyDataSetChanged() "por defecto". Para que funcione anular el getItemPosition() en su implementación del adaptador

@Override 
public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

Y como ya se ha dicho, después de añadir/quitar fragmentos llaman (en su showOtherPage())

mAdapter.notifyDataSetChanged(); 
+1

Gracias, pero como efecto secundario la el rendimiento para cambiar páginas disminuyó enormemente. Me gusta 2 segundos para cambiar las páginas en el Galaxy Tab 10'1 (evento Google I/O). Antes de su sugerencia, fue instantáneo. –

+0

¡Gracias, ahorras mi tiempo! – ihrupin

Cuestiones relacionadas