I am trying to make a simple example RecyclerView with animation, but default animation is not working. Why is that? What is missing here?
Main 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 class Song includes fields int id, String Name, String Author, getter and setter methods.
notifyDataSetChanged()
in your onClick()
, it will
cancel all animation at any time.add/removeItem()/
includes notifyItemInserted/Removed()
, so please add/remove single item every time and in that way animation will play correctly. If you want to add/remove more than 1 items at a same time, use notifyItemRangeInserted/Removed(int startPos, int itemsSize)
instead after all adding/removing of dataset finished.Override getItemId(int position)
method in your adapter and call setHasStableIds(true)
in the constructor, for example.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With