Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 772
Kenny Avatar asked Apr 26 '15 04:04

Kenny


2 Answers

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

like image 135
Kenny Avatar answered Sep 20 '22 19:09

Kenny


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.

like image 42
Saenic Avatar answered Sep 20 '22 19:09

Saenic