Reputation: 103
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.
Upvotes: 9
Views: 6827
Reputation: 15054
Override getItemId(int position)
method in your adapter and call setHasStableIds(true)
in the constructor, for example.
Upvotes: 9
Reputation: 11695
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.Upvotes: 10