Wie verwende ich eine GridLayoutAnimation in einem RecyclerView?

8

Ich versuche mein GridView durch das neue RecyclerView zu ersetzen (mit GridLayoutManager), aber es scheint, dass es mit gridLayoutAnimation ( ClassCastException: LayoutAnimationController$AnimationParameters cannot be cast to GridLayoutAnimationController$AnimationParameters ) nicht gut zurechtkommt. Es funktioniert mit einer normalen Layoutanimation, aber da es sich um ein Raster handelt, dauert es auf Tablets zu lange, um es zu vervollständigen.

Was ich erreichen möchte, ähnelt Hierarchical Timing Wenn Sie sich das Beispielvideo ansehen, wird die Layoutanimation von oben links nach unten - rechts diagonal angezeigt. Eine reguläre Layoutanimation würde die Animation Reihe um Reihe ausführen, wodurch es zu viel Zeit erfordert, um auf größeren Gittern (z. B. Tablets) zu vervollständigen. Ich habe auch versucht, ItemAnimator zu erkunden, aber das würde nur die Animation auf allen Zellen simultan wie im Beispiel "Do not" ausführen.

Gibt es eine Möglichkeit, diese Rasterlayout-Animation in einem RecyclerView zu erstellen?

Dies ist die Datei gridview_layout_animation.xml:

%Vor%

Und das ist die Animation grow_in.xml:

%Vor%

BEARBEITEN: Basierend auf der Antwort von Galaxas0 ist hier eine Lösung, zu der Sie nur verpflichtet sind Verwenden Sie eine benutzerdefinierte Ansicht, die RecyclerView erweitert. Im Grunde nur die attachLayoutAnimationParameters() -Methode überschreiben. Damit funktioniert <gridLayoutAnimation> genauso wie mit GridView.

%Vor%     
Musenkishi 24.10.2014, 00:23
quelle

3 Antworten

5

LayoutAnimationController ist in ViewGroup eingekoppelt, und sowohl ListView als auch GridView erweitern die unten angegebene Methode, um die animationParams des Kindes bereitzustellen. Das Problem ist, dass GridLayoutAnimationController eine eigene AnimationParameters benötigt, die nicht in der Klasse gegossen werden kann.

%Vor%

Da diese Methode standardmäßig einen LayoutAnimationController.AnimationParameters anstelle von GridLayoutAnimationController.AnimationParameters hinzufügt, sollte der Fix darin bestehen, einen vorher anzulegen und anzuhängen. Was wir implementieren müssen, ist was GridView bereits tut:

%Vor%

Um GridView zu replizieren, ist es am nächsten, die Änderungen in onBindViewHolder() zu ändern, wodurch sie vor dispatchDraw ausgeführt werden können, dem Aufruf, der Animationen auslöst.

%Vor%

Wenn Sie RecyclerView 's GridLayoutManager verwenden, versuchen Sie, Parameter von diesem zu bekommen. Das obige Beispiel ist ein Proof of Concept, um zu zeigen, dass es funktioniert. Ich habe Werte programmiert, die nicht genau für meine Anwendung funktionieren.

Da dies eine API ist, die es seit API 1 gibt, ohne echte Dokumentation oder Beispiele, würde ich dringend davon abraten, sie zu verwenden, da es viele Möglichkeiten gibt, ihre Funktionalität zu replizieren.

    
Aditya Vaidyam 27.10.2014, 19:43
quelle
2

Einfachere Lösung

%Vor%

Aber vergiss nicht, deinen RecyclerAdapter setHasStableIds(true); zu erstellen und getItemID()

zu implementieren %Vor%     
Simon K. Gerges 31.05.2016 12:09
quelle
0

Zitieren @Musenkishi bei Ссылка

  

Keine Ahnung. Rufen Sie nach dem Einstellen des Adapters recyclerView.scheduleLayoutAnimation(); an? Und hast du android:layoutAnimation="@anim/your_layout_animation" auf dein <GridRecyclerView> im Layout gesetzt?

Das hat mein Problem gelöst.

    
Rafael Ruiz 06.02.2016 19:54
quelle