Android: Viewpager et FragmentStatePageAdapter
Je suis la conception d'une application qui permet aux utilisateurs de basculer entre plusieurs pages dans un ViewPager. J'ai eu du mal à essayer de comprendre comment il est possible de retirer un Fragment de l'instance à partir d'une page lorsqu'elle n'est plus visible sur l'écran, de les mettre en cache (pour, par exemple, une table de hachage), puis de la restaurer, de sorte que lorsque l'utilisateur revient à la page, les points de vue et tout le reste sera dans le même état qu'il était avant l'enlèvement. Par exemple, ma première page est un écran de connexion qui fait que certains éléments de mise en page sur la page visible/invisible sur une connexion réussie. Quand j'ai avancer assez de pages, puis retourner à la première page, la mise en page est remise à zéro. Cela devient plus un problème pour un autre de mes pages, qui contient un énorme, de défilement horizontale/verticale de la grille de données que j'utilise un thread en arrière-plan quand il s'initialise. J'utilise une boîte de dialogue de progression pour avertir l'utilisateur de la progression du chargement et cela devient vraiment ennuyeux à chaque fois que je charge.
J'ai donc fait quelques recherches...
J'ai parcouru le code source pour FragmentStatePageAdapter et dans le destroyItem() de rappel, l'état du Fragment de l'instance en cours de suppression est enregistré à une liste de tableaux. Lorsqu'une nouvelle instance du Fragment est en cours de création dans le instantiateItem() de rappel, si une instance d'un élément n'existe pas déjà (ils en gardent la trace à l'aide d'une liste de tableaux), un nouveau Fragment instance est créée et son état enregistré est initialisé avec le Fragment correspondant.SavedState de données. Malheureusement, ces données ne comprennent pas l'état que les points de Vue ont été en même si j'ai remarqué que pour les pages avec un GridView/ListView, l'état des points de Vue étaient en quelque sorte restauré (si je me défile à certaines position aléatoire, renversé quelques pages et revenait, il ne serait pas remise).
Selon l'API:
L'état enregistré ne peut pas contenir des dépendances sur d'autres fragments --
c'est qu'il ne peut pas utiliser putFragment(Bundle, String, Fragment) pour stocker une
fragment de référence, parce que la référence ne peut pas être valide lorsque cette
sauvé de l'état est utilisé plus tard. De même, le Fragment de la cible et le résultat
code ne sont pas inclus dans cet état.
Être un noob pour Android, je ne suis pas tout à fait sûr de comprendre la dernière instruction.
Cela étant dit, est-il un moyen pour mettre en cache la Vue de l'état? Si non, je pense que je vais juste aller de l'avant et aller avec laissant à tous le fragment de pages en mémoire.
OriginalL'auteur Android Noob | 2011-08-02
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème problème et résolu par la mise en œuvre de ces deux fonctions
sur les fragments que je voulais sauver. Sur la première fonction, vous devez l'enregistrer dans le Bundle de la date que vous avez besoin de restaurer les points de vue ( dans mon cas, j'ai eu un tas de spinner j'ai donc utilisé
un tableau int pour sauver leurs postes). La deuxième fonction, qui est appelée lors de la restauration de votre fragment, est l'endroit où vous mettre en œuvre le processus de restauration.
J'espère que cette aide. J'ai aussi fait mon adaptateur pour hériter de FragmentStatePageAdapter mais je ne suis pas sûr que ce soit obligatoire.
OriginalL'auteur rui.araujo
Liste des main.xml
De la configuration de l'ViewPager
La PagerAdapter
regardez ici pour plus de détails vue pager exemple
OriginalL'auteur Natali
Regardant les différentes pièces de documentation, ma meilleure supposition est que le point de vue de la création ne disposez pas d'un ID qui leur est attaché. En supposant que le fragment de l'état sauvegardé est créé à partir d'un Fragment.onSaveInstanceState, puis le fragment sera automatiquement enregistrer n'importe quelle vue de l'état qui a un id. Vous avez probablement un défaut de l'id associé à votre ListView/GridView si vous avez créé à partir d'un fichier de mise en page. Vous pouvez également associer un id avec les vues en appelant setId.
Aussi, pour votre personnalisé rempli fragment, vous pouvez également avoir à faire quelque chose de personnalisé dans onSaveInstanceState.
OriginalL'auteur MJD
Voici un exemple de la façon dont j'ai mis en œuvre la mise en cache dans PagerAdapter. Après le remplissage du cache toutes les futures demandes d'affichage sont servi de cache, seules les données est remplacé.
OriginalL'auteur vladexologija
J'ai aussi rencontré ce problème lorsque j'ai été en utilisant PagerSlidingTabStrip et de l'aide et de l'instance de FragmentPagerAdapter, commutation de FragmentStatePagerAdapter certainement travaillé.
Puis-je utiliser onSaveInstanceState() pour enregistrer sate
OriginalL'auteur tonstert