40 votes

Android: Animation des modifications du contenu GridView

J'ai un GridView des mises en page qui peuvent être dynamiquement ajoutés ou retirés de la grille.

Dans iOS, le natif de comportement pour les éléments GridView est pour les autres éléments de la grille de glisser en place de l'élément supprimé, ou faites glisser pour faire de la place quand un nouvel article est ajouté.

Cependant sur Android le comportement est juste pour que les modifications instantanément apparaître sur l'écran. J'ai essayé d'ajouter des animations personnalisées pour chaque getView() appel à l'aide de quelques astuces dans le contrôle GridView l'adaptateur, mais qui a fini par causer quelques problèmes vu ici:

Android GridView de chargement de 0 élément indexé dans une version ultérieure de l'indice du logement lorsque l'ensemble de données de changements

J'ai essayé d'avoir les points de vue de chacun de contrôle de l'animation à la place de la getView() la méthode de la carte, mais le résultat final est identique.

J'ai aussi essayé d'utiliser un GridLayoutAnimationController, comme ceci:

Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.grid_item_fadein);
GridLayoutAnimationController controller = new GridLayoutAnimationController(animation, .2f, .2f);
mGrid.setLayoutAnimation(controller);

Cela fonctionne sur le chargement initial de toutes les GridView contenu, mais de tout changement de contenu instantanément pop comme il le fait par défaut.

J'ai l'impression que c'est assez simple fonctionnalité, et il devrait y avoir un moyen plus facile de le faire. Le meilleur que j'ai vu à partir de la recherche en ligne est une bibliothèque qui anime GridView éléments qui changent de place dans la grille, mais ce n'est pas ce que je cherche (dans la même bibliothèque, lorsque vous supprimez un élément de la Grille via la suppression de l'instant même effet que j'essaie d'éviter de se produit).

Une réponse commune, DONC je ai aussi vu est "Regardez la APIDemos, il y a des tonnes d'exemples." Mais aussi loin que je peux voir, il y a en fait pas d'exemples pour animer GridView modifications de contenu.

Toute aide est appréciée, merci.

7voto

Alex Fu Points 2184

Chet Haase est sorti avec une belle vidéo sur la façon de gérer ListView animations correctement. Le concept de base peut être appliquée à GridViews. Vous trouverez la vidéo ici.

Si vous êtes en développement pour API 1.0+, vous ne serez pas en mesure d'utiliser le référencés fonctions d'animation que la vidéo mentionne (comme ViewPropertyAnimator), sauf si vous utilisez NineOldAndroids.

4voto

salfon Points 126

Je pense que pour AdapterViews, le LayoutTransition de ViewGroup ne fonctionne pas. En regardant le code source, ViewGroup assure la transition animations des autres enfants arrivent pour les appels à l' addView et removeView, mais la dérivée AdapterView n'utilise pas ces méthodes, car elle repose sur un adaptateur pour l'approvisionnement des points de vue.

Chet Haase vidéo mentionnée ci-dessus est sur l'animation d'un seul enfant en vue d'une ListView qui est en train de disparaître, plutôt que d'animation de tous les autres environnant les vues enfant qui se déplacent pour combler l'écart.

Et, si je suis le comprendre, à droite, le GridLayoutAnimationController est d'environ décalés des animations pour les enfants, comme ils remplissent (c'est à dire de la première heure ou une nouvelle disposition de l'ensemble de la liste, à partir de vide), plutôt que de les animer en place des changements de disposition des enfants des environs après un ajouter ou à supprimer. oui, les enfants apparaissent par la décoloration ou de glissement ou de rotation dans - toujours un à la fois, de la première à la dernière.

Enfin, une proposition de solution: si vous n'avez pas besoin d'une carte-vue, vous pourriez passer à GridLayout ou LinearLayout. C'est là que animateLayoutChanges="true" , et que la "mise en page de l'animation" démos toujours. Note LayoutTransition exige qu'un minimum d'api de niveau 11. et GridLayout nécessite api14.

4voto

Mescht Points 21

Après avoir apporté des modifications à GridView comme .remove (), vous devez appeler mGrid.startLayoutAnimation ();

GridView ne le fera pas automatiquement pour vous. Vous devez le déclencher manuellement ;-)

2voto

Samyboy89 Points 510

J'ai trouvé ce lien de ressource très utile pour traiter l'animation d'autres vues de mise en page telles que LinearLayout, etc.: http://developer.android.com/training/animation/layout.html J'espère que cela pourra vous aider. Vous pouvez également consulter https://github.com/nhaarman/ListViewAnimations pour trouver de l'inspiration.

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