9 votes

Destruction de pages sur ViewPager et FragmentStatePagerAdapter

Nous essayons de créer une application Android basée sur ViewPager qui reçoit pendant l'exécution des instructions 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.

En suivant 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 plus comme une vue de liste.

Mais quand on essaie de le faire : - supprimer une page qui n'est pas à l'écran - et de 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 la plateforme Android récupère la page morte et l'affiche à 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 en forçant la plateforme à 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 plate-forme détruit effectivement la page et crée un nouvel objet de la même classe. Voici un petit exemple reproduisant le problème et ce comportement.

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

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

Dans ce projet, lorsque vous touchez le TextView sur la première page, il a été conçu pour supprimer la deuxième page (qui est verte) et la remplacer par 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 lorsque vous appuyez sur le bouton retour d'Android sur la deuxième page (verte) et que vous touchez le TextView, la deuxième page créée sera de la bonne couleur bleue.

13voto

207 Points 2385

Lorsque vous travaillez avec des ListView et que vous modifiez les données sous-jacentes de votre adaptateur, vous appelez notifyDataSetChanged() et toute vue reflétant l'ensemble des données se rafraîchira. C'est aussi la façon dont vous devriez procéder avec l'adaptateur de pager de fragment.

Dans votre cas, vous ne notifiez pas l'adaptateur. Cependant, en cas de FragmentPagerAdapter / FragmentStatePagerAdapter cela ne fait pas de différence parce que ces adaptateurs ignorent notifyDataSetChanged() "par défaut". Pour que cela fonctionne, il faut remplacer l'option getItemPosition() dans l'implémentation de votre adaptateur

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

Et comme déjà dit, après avoir ajouté/supprimé l'appel de fragments (dans vos showOtherPage() )

mAdapter.notifyDataSetChanged();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X