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.
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.
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:
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.
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.
Einfachere Lösung
%Vor% Aber vergiss nicht, deinen RecyclerAdapter setHasStableIds(true);
zu erstellen und getItemID()
Zitieren @Musenkishi bei Ссылка
Keine Ahnung. Rufen Sie nach dem Einstellen des Adapters
recyclerView.scheduleLayoutAnimation();
an? Und hast duandroid:layoutAnimation="@anim/your_layout_animation"
auf dein<GridRecyclerView>
im Layout gesetzt?
Das hat mein Problem gelöst.
Tags und Links android android-recyclerview layout-animation