How to implement ItemAnimator of RecyclerView to disable the animation of notifyItemChanged
In my project I need disable the "change" animation of RecyclerView
while notifyItemChanged
.
I investigated in the source of RecyclerView
and had overridden android.support.v7.widget.DefaultItemAnimator
as below:
private static class ItemAnimator extends DefaultItemAnimator
{
@Override
public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY) {
if(oldHolder != null)
{
oldHolder.itemView.setVisibility(View.INVISIBLE);
dispatchChangeFinished(oldHolder, true);
}
if(newHolder != null)
{
dispatchChangeFinished(newHolder, false);
}
return false;
}
}
But I am not sure if I match the spec of the Google document:
RecyclerView.ItemAnimator.animateChange
According to my understanding source code, if I do not override the method properly, the oldHolder will not be recycled.
Please help me figure out how to override animateChange
in a correct way.
Solution 1:
I have found the correct solution to just remove the animateChange.
It's very simple. Google has implemented the functionality.
((SimpleItemAnimator) RecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
Documentation: setSupportsChangeAnimations
Solution 2:
I had the same problem. When calling notifyItemChanged there was a red overlay flashing. After experimenting around with your code I finally removed the default Animator by simply calling
recyclerView.setItemAnimator(null);
on the RecyclerView.
Solution 3:
@Kenny answer didn't work anymore because google remove method setSupportsChangeAnimations()
(but why?) in support library 23.1.0.
In some case setChangeDuration(0)
can work as workaround.
@edit I suggest use something like that:
RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}
Solution 4:
Just if someone stumbles like me:
Somehow setSupportsChangeAnimations(false)
didn't work for me, but recyclerView.getItemAnimator().setChangeDuration(0)
has just removed the animation nicely.