RecyclerView animation not working

I am trying to make a simple RecyclerView example with animation, but animation by default does not work. Why is this? What is missing here?

Primary activity:

public class MainActivity extends Activity { List<Song> songsList; RecyclerView recyclerView; MyAdapter myAdapter; RecyclerView.LayoutManager layoutManager; Song song1; Song song2; Song song3; Song song4; Song song5; Song song6; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); songsList = new ArrayList<>(); song1 = new Song(); song1.setName("Label1"); song1.setAuthor("Author1"); song1.setId(1); song2 = new Song(); song2.setName("Label2"); song2.setAuthor("Author2"); song2.setId(2); song3 = new Song(); song3.setName("Label3"); song3.setAuthor("Author3"); song3.setId(3); song4 = new Song(); song4.setName("Label4"); song4.setAuthor("Author4"); song4.setId(4); song5 = new Song(); song5.setName("Label5"); song5.setAuthor("Author5"); song5.setId(5); song6 = new Song(); song6.setName("Label6"); song6.setAuthor("Author6"); song6.setId(6); songsList.add(song1); songsList.add(song2); songsList.add(song3); recyclerView = (RecyclerView) findViewById(R.id.listView); recyclerView.setHasFixedSize(false); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); myAdapter = new MyAdapter(songsList); recyclerView.setAdapter(myAdapter); RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator(); recyclerView.setItemAnimator(itemAnimator); } public void onClick(View view) { songsList.add(song4); myAdapter.addItem(song4); songsList.add(song5); myAdapter.addItem(song5); songsList.add(song6); myAdapter.addItem(song6); songsList.remove(song1); myAdapter.removeItem(1); songsList.remove(song2); myAdapter.removeItem(2); myAdapter.notifyDataSetChanged(); } } 

Adapter:

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<Song> songList; public MyAdapter(List<Song> songList) { this.songList = songList; } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder viewHolder, int i) { Song song = songList.get(i); viewHolder.song.setText(song.getName()); viewHolder.author.setText(song.getAuthor()); } @Override public int getItemCount() { return songList.size(); } public void removeItem(int position) { songList.remove(position); notifyItemRemoved(position); } public void addItem(Song song) { songList.add(song); notifyItemInserted(songList.size()); } class ViewHolder extends RecyclerView.ViewHolder { private TextView song; private TextView author; public ViewHolder(View itemView) { super(itemView); song = (TextView) itemView.findViewById(R.id.tvSong); author = (TextView) itemView.findViewById(R.id.tvAuthor); } } } 

The Song class includes the fields int id, String Name, String Author, getter and setter methods.

+6
source share
2 answers
  • Do not use notifyDataSetChanged() in onClick() , it will cancel the animation at any time.
  • Your add/removeItem()/ includes notifyItemInserted/Removed() , so every time you add / remove a separate element, and thus the animation will play correctly. If you want to add / remove more than one item at a time, use notifyItemRangeInserted/Removed(int startPos, int itemsSize) instead of completing adding / removing a dataset.
+7
source

Override the getItemId(int position) method in your adapter and call setHasStableIds(true) in the constructor, for example.

+5
source

All Articles