2010-03-05 8 views
29

Czy można zastosować animację rozwijania lub zwijania dla expandableListView?Animacja do rozbudowyListView

+0

Nie sądzę, że można zrobić różnicę między wierszami, animując, mimo że umieszczam slajd w lewo/w prawo w widoku, który pokazuję jako dziecko. To naprawdę działa tylko dlatego, że jest tylko jedno dziecko. – skorulis

Odpowiedz

10

Można to zrobić za pomocą prostego ListView, który zawiera początkowo ukryty widok i niestandardową klasę, która rozszerza animację. Podstawową ideą jest zacząć od View.GONE, a następnie stopniowo zmieniać rozmiar marginesu z wartości ujemnej na wymagany rozmiar, ustawiając widoczność na View.VISIBLE.

Patrz:

..i wreszcie

Ostatni przykład zawiera cały potrzebny kod. Wygląda na to, że jestem trochę hackowaty, szczególnie, że najpierw musisz ustawić view.bottomMargin = -50 lub więcej, w przeciwnym razie animacja nie działa poprawnie za pierwszym razem, ale jak dotąd nie znalazłem żadnej realnej alternatywy (poza używaniem ScrollView z własną elementy kontenera zamiast ListView).

I wreszcie, ta aplikacja zawiera powyższy przykład, wśród wielu innych przydatnych przykładów wraz z odnośnikami do źródeł:

Aktualizacja: Google usunął aplikację ze sklepu Play rzekomo dla intelektualnej naruszenie własności (choć zawierało tylko wersje demonstracyjne i linki do projektów open source), autor udostępnił teraz plik APK do bezpośredniego pobrania z http://goo.gl/ihcgs . Aby uzyskać więcej informacji, zobacz: https://plus.google.com/108176685096570584154/posts. NB: Nie jestem związany z autorem.

+0

Dzięki za link do aplikacji ui patterns. – howettl

+0

, ale straci to cały sens używania listView, ponieważ wszystkie elementy wewnątrz grupy (które należy rozwinąć) muszą znajdować się wewnątrz niego. jeśli masz tam dużo przedmiotów, będziesz musiał tam również stworzyć wiele widoków ... –

+0

@android developer: możesz lepiej skorzystać z ScrollView, zapełnić widokami i zastosować do nich animacje wymagany. ListView jest złożonym komponentem, który jest zoptymalizowany pod kątem dużych list; jeśli masz tylko tuzin przedmiotów, widok przewijania może być łatwiejszy do animacji - stwórz własny komponent blokowy i animuj widoki w nim, jak chcesz. Główną wadą w porównaniu z ListView jest to, że android nie będzie tworzyć/niszczać twoich przedmiotów, ponieważ są one przewijane do i z obszaru widoku, a pojemniki nie będą ponownie używane, ale jeśli masz kilka przedmiotów, to nie jest wielka sprawa . – ccpizza

1

Wykonałem podobną pracę dla prostego widoku listy. W tym celu przesłoniłem metodę getView i zastosowałem translację animacji w górę (lub w dół) na każdej pozycji listy. O stopniu tłumaczenia decydowała pozycja na liście pozycja.

+0

https://github.com/idunnololz/AnimatedExpandableListView/ –

1

Znalazłem możliwe (częściowe) obejście tego problemu.

najpierw trzeba zapisać stan zwoju ExpnadableListView:

@Override 
public void onScrollStateChanged(final AbsListView view, final int scrollState) { 
    this.mScrollState = scrollState; 
} 

public int getScrollState() { 
    return this.mScrollState; 
} 

dla samego ListView, trzeba przechowywać której grupy został kliknięty, tak, że tylko jego dzieci będą się animowany:

mListView.setOnGroupClickListener(... 
@Override 
public boolean onGroupClick(...){ 
mGroupPosition=groupPosition; 

teraz w sposobie getChildView(), sprawdzić stan przewijania, a jeśli jest bezczynny, należy uruchomić animację, na przykład:

public View getChildView(...) { 
// <=prepare rootView and return it later 
if (groupPosition==mGroupPosition&&getScrollState() == OnScrollListener.SCROLL_STATE_IDLE) 
    rootView.setAnimation(...) 

spowoduje to ustawienie animacji dla widoków potomnych przy każdym rozszerzeniu grupy.

wadą tego są:

  1. tylko dla rozbudowanych widoków podrzędnych. będziesz musiał pomyśleć o dodatkowej logice, aby ożywić je po zwijaniu grupy.
  2. wszystkie animacje rozpoczynają się od razu. będziesz musiał dodawać wiele animacji jeden po drugim, jeśli chcesz, aby działało inaczej.
+0

To ciekawe podejście, ale z tego, czego się dowiedziałem, dziecko * przedmioty * nie są widokami * dziecka *, ale rodzeństwem. Czy animujesz wszystkie dzieci z oddzielnymi animacjami lub dokładnie jak to robisz? ? Przykładowy kod? – Nilzor

+0

@Nilzor Zrobiłem to dawno temu, a wymóg animacji został usunięty ze względu na krótki czas, kiedy musiałem nad tym popracować Niestety, –

+0

Nie prob, dzięki za skontaktowanie się ze mną. Dla każdego, kto tam jest, problem wciąż pozostaje nierozwiązany, chociaż wydaje mi się, że powinno to być rozwiązanie tego problemu przez Google, jeśli poważnie traktują wytyczne dotyczące Material Design – Nilzor