2013-04-08 12 views
40

Mam GridView układów, które mogą być dynamicznie dodawane lub usuwane do siatki.Android: Animowanie zmian w treści GridView

W iOS rodzimym zachowaniem dla elementów GridView jest umieszczenie innych elementów w siatce w miejscu usuniętego elementu lub przesuwanie, aby zrobić miejsce po dodaniu nowego elementu.

Jednak na Androidzie zachowanie polega tylko na tym, aby zmiany natychmiast pojawiały się na ekranie. Próbowałem dodając niestandardowe animacje dla każdego getView() rozmowy przy użyciu kilku sztuczek w adapterze GridView, ale to skończyło się powodując pewne problemy widać tutaj:

Android GridView loading the 0 indexed item in a later index's slot when data set changes

Próbowałem posiadające indywidualne poglądy kontrolować animację zamiast getView() metoda adaptera, ale wynik końcowy był identyczny.

Próbowałem też za pomocą GridLayoutAnimationController, tak:

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

Działa to na wstępnym obciążeniu wszystkich GridView treści, ale wszelkie zmiany tych treści tylko natychmiast wyskoczyć jak to robi domyślnie.

Mam wrażenie, że jest to bardzo prosta funkcja i powinien istnieć łatwiejszy sposób na zrobienie tego. Najlepsze, co widziałem w wyszukiwaniu online, to a library, które animuje elementy GridView, które zamieniają miejsca w siatce, ale to nie jest to, czego szukam (w tej samej bibliotece, kiedy usuwasz element z siatki przez usunięcie taki sam efekt natychmiastowy, którego próbuję uniknąć).

Powszechną odpowiedzią na temat SO, którą również widziałem jest "Spójrz na APIDemos, jest mnóstwo przykładów". Ale o ile widzę, w rzeczywistości nie ma przykładów animacji zmian zawartości GridView.

Każda pomoc jest doceniana, dzięki.

+1

Jakiego rodzaju animacje chcesz dodać? Dodanie właściwości xml "animateLayoutChanges = true" zapewni podstawowe animacje płynów do niemal każdego widoku. – klmprt

+1

To pierwsza rzecz, którą wypróbowałem i niestety nie działa. – JMRboosties

+0

Maj, wiem, jak zatrzymać tę animację. –

Odpowiedz

7

Chet Haase wyszedł z miłym wideo o tym, jak poprawnie obsługiwać animacje ListView. Podstawowa koncepcja może być zastosowana do GridViews. Możesz znaleźć film wideo here.

Jeśli pracujesz nad API 1.0+, nie będziesz w stanie korzystać z przywoływanych funkcji animacji wymienionych w filmie (np. ViewPropertyAnimator), chyba że używasz NineOldAndroids.

4

Myślę, że dla AdapterViews, LayoutTransition z ViewGroup nie będzie działać. Patrząc na kod źródłowy, ViewGroup zapewnia animacje przejścia innych dzieci w przypadku wywołań do addView i removeView, ale wyprowadzony AdapterView nie używa tych metod, ponieważ opiera się na adapterze do dostarczania widoków.

Wspomniane wyżej wideo Cheta Haase'a dotyczy animacji widoku jednego dziecka z widoku listy, które znika, zamiast animowania wszystkich innych otaczających widoków dziecka, które poruszają się, aby wypełnić lukę.

A jeśli dobrze rozumiem, GridLayoutAnimationController to animacja przerywana dla dzieci, które wypełniają (tj. Pierwszy lub pełny przekaz całej listy, zaczynając od pustej), zamiast animować po dodaniu lub usunięciu umieść zmiany w układzie otaczających dzieci. tak więc dzieci pojawiają się poprzez zanikanie, wsuwanie się lub wirowanie - zawsze pojedynczo, od pierwszego do ostatniego.

Wreszcie sugerowane rozwiązanie: jeśli nie potrzebujesz widoku opartego na adapterze, możesz przełączyć na GridLayout lub LinearLayout. To tam zadziała animateLayoutChanges="true" i zawsze będą używane dema "animacji układu". Uwaga LayoutTransition wymaga minimalnego poziomu api na poziomie 11. GridLayout wymaga api14.

4

Po wprowadzeniu zmian w GridView, takich jak .remove() , należy zadzwonić pod numer mGrid.startLayoutAnimation();

GridView nie zrobi tego automatycznie za Ciebie. Musisz uruchomić go ręcznie ;-)

Powiązane problemy