2012-04-05 4 views
9

Nous essayons de créer une application Android basée sur ViewPager qui reçoit pendant les instructions d'exécution pour ajouter et supprimer des pages. Presque comme une expérience de navigateur à onglets, que vous pouvez supprimer l'onglet actuel, ou supprimer un onglet spécifique.Destroy Pages sur ViewPager et FragmentStatePagerAdapter

Après la documentation de Google, nous utilisons FragmentStatePagerAdapter, qui est destiné à être utilisé dans des situations où il y a un grand nombre de pages, fonctionnant davantage comme une vue de liste.

Mais quand nous essayons de: - supprimer une page qui ne sont pas sur l'écran - et créer un nouvel objet fragment de la même classe - et sur la même position de la page supprimée Nous avons remarqué que l'Android plate-forme récupérer la page morte et l'afficher à l'utilisateur. Le nouvel objet que nous venons de créer n'exécute simplement pas "onCreate", "onCreateView" ou "onActivityCreated".

Nous cherchons des moyens de résoudre ce problème, forçant la plate-forme à utiliser notre nouvel objet fragment de la même classe. Des idées?

Nous avons découvert que si nous détruisons la page actuelle, la plateforme a effectivement détruit la page et créé un nouvel objet de la même classe. Voici un petit exemple de réplication du problème et de ce comportement.

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

Vidéo: http://www.youtube.com/watch?v=-oaXXwU8PSI&hd=1

De ce projet lorsque vous touchez la TextView sur la première page, il a été conçu pour enlever la deuxième page (ce qui est vert) à une nouvelle page bleue. Vous verrez que même en faisant cela à partir de la première page, la deuxième page reste verte. Mais quand vous appuyez sur le bouton arrière Android sur la deuxième page (vert) et touchez le TextView la deuxième page créée sera la bonne couleur bleue.

Répondre

13

Lorsque vous traitez avec ListView et que vous modifiez les données sous-jacentes de votre carte, vous appelez le notifyDataSetChanged() et toute vue reflétant l'ensemble de données se rafraîchira automatiquement. Thats la façon dont vous devriez aller avec l'adaptateur de pageur fragment aussi.

Dans votre cas, vous ne notifiez pas l'adaptateur. Cependant, dans le cas de FragmentPagerAdapter/FragmentStatePagerAdapter, cela ne fait aucune différence car ces adaptateurs ignorent notifyDataSetChanged() "par défaut". Pour le faire fonctionner remplacer le getItemPosition() dans votre implémentation de l'adaptateur

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

Et comme déjà dit, une fois que vous ajoutez/supprimer des fragments appel (dans votre showOtherPage())

mAdapter.notifyDataSetChanged(); 
+1

Merci, mais comme un effet secondaire du la performance pour changer les pages a diminué considérablement. Comme 2 secondes pour changer de page sur le Galaxy Tab 10'1 (événement Google I/O). Avant votre suggestion, c'était instantané. –

+0

Merci, vous économisez mon temps! – ihrupin

Questions connexes