2012-11-15 18 views
17

Pracuję na systemie Android z zestawem danych (ArrayList), który wypełnia ListView. W momencie zmiany trybu sortowania ponownie zamawiam dane powiązane z adapterem i wywołuję notifyOnDataChanged(), aby zaktualizować listę.Animowana zmiana danych listview

Wykonuje to zadanie, ale chciałbym móc animować każdy element do nowej pozycji (jak na iOS), ponieważ oba zestawy danych zawierają te same elementy - po prostu zmieniono je.

Spędziłem trochę czasu, zastanawiając się, jak to animować i postanowiłem animować wszystkie przedmioty, które pojawiają się w dolnej części listy, na wysokość zero, a następnie animować z powrotem do ich normalnego rozmiaru w nowej pozycji. Pozwoliłoby to, aby wszystkie elementy, które poruszają się w górę, przesuwały się w górę na liście, gdy elementy zniknęły nad nią. Więc to jest idea, ale nie mogę wymyślić, jak ją wdrożyć.

dane mogą być reprezentowane tak:

Set A | index | Set B 
------+-------+------ 
A  | 0  | B 
B  | 1  | A 
C  | 2  | C 
D  | 3  | F 
E  | 4  | G 
F  | 5  | E 
G  | 6  | D 

prostu szukam czegoś, co iOS obsługuje domyślnie dla Androida. To nie powinno być takie trudne.

+2

Jestem również bardzo zainteresowany tym. Nie tylko zmienia kolejność, ale także animuje dodawanie/usuwanie. – goncalossilva

+0

naprawiłeś to? Chcę znaleźć rozwiązanie. Czy mógłbyś pomóc? – Nevaeh

Odpowiedz

11

Wykonano mały przykład animujący zmianę kolejności takich list. Animacja nie jest dokładnie taka, jak opisałeś, ale mam nadzieję, że pomaga ci osiągnąć to, czego chcesz.

https://github.com/fabrantes/widgetexamples

Przepływ jest coś takiego:

  1. Zapisz aktualny stan przed notifyDataSetChanged(). Zapisanie stanu polega na zapisaniu współrzędnej getTop() dla każdego elementu.
  2. Po notifyDataSetChange przejrzyj wszystkie widoki ListView i zastosuj funkcję TranslateAnimation z różnicą wysokości między nową pozycją przedmiotu a starą pozycją.
+0

Jak podejść do dodawania/usuwania do listy? Czy to nie zepsuje ponownego zamówienia? – goncalossilva

+0

Naprawdę wolałbym, gdyby przyszedł w formie podklasy ListView i gdyby miał obsługę dodanych/usuniętych elementów, ale hej, dzięki za wysiłek :-) – goncalossilva

+0

Nie wiem o dodawaniu/usuwaniu. Co do tworzenia podklasy ListView, to powinno być łatwe. Utwórz wspomnianą podklasę i umieść wymagane funkcje w środku. Następnie nadpisaj notifyDataSetChanged i wywołaj tam te funkcje (ostrożnie z zamówieniem). – fabrantes

3

Mam nadzieję, że jest to rozwiązanie twoich problemów

<ListView 
      android:id="@+id/listUniversal" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layoutAnimation="@anim/controller"> 

     </ListView> 

anim.xml

<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" 
    android:animation="@anim/scale_1" 
    android:delay="50%" /> 

scale_1.xml

<scale 
    android:duration="200" 
    android:fromXScale="0.1" 
    android:fromYScale="0.1" 
    android:pivotX="10%" 
    android:pivotY="10%" 
    android:startOffset="100" 
    android:toXScale="1" 
    android:toYScale="1.0" /> 

+0

Dodaj przestrzeń nazw do elementu skali i idealnie! (xmlns: android = "http://schemas.android.com/apk/res/android"). – Fer

+0

Co z animacją, aby usunąć element z listy? Jak mogłem to zrobić? – Fer

Powiązane problemy