android – 动画RecyclerView不起作用

前端之家收集整理的这篇文章主要介绍了android – 动画RecyclerView不起作用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图用动画制作一个简单的例子RecyclerView,但默认动画不起作用.这是为什么?这里缺少什么?

主要活动:

  1. public class MainActivity extends Activity {
  2.  
  3. List<Song> songsList;
  4. RecyclerView recyclerView;
  5. MyAdapter myAdapter;
  6. RecyclerView.LayoutManager layoutManager;
  7.  
  8. Song song1;
  9. Song song2;
  10. Song song3;
  11. Song song4;
  12. Song song5;
  13. Song song6;
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19.  
  20. songsList = new ArrayList<>();
  21.  
  22. song1 = new Song();
  23. song1.setName("Label1");
  24. song1.setAuthor("Author1");
  25. song1.setId(1);
  26.  
  27. song2 = new Song();
  28. song2.setName("Label2");
  29. song2.setAuthor("Author2");
  30. song2.setId(2);
  31.  
  32. song3 = new Song();
  33. song3.setName("Label3");
  34. song3.setAuthor("Author3");
  35. song3.setId(3);
  36.  
  37. song4 = new Song();
  38. song4.setName("Label4");
  39. song4.setAuthor("Author4");
  40. song4.setId(4);
  41.  
  42. song5 = new Song();
  43. song5.setName("Label5");
  44. song5.setAuthor("Author5");
  45. song5.setId(5);
  46.  
  47. song6 = new Song();
  48. song6.setName("Label6");
  49. song6.setAuthor("Author6");
  50. song6.setId(6);
  51.  
  52. songsList.add(song1);
  53. songsList.add(song2);
  54. songsList.add(song3);
  55.  
  56. recyclerView = (RecyclerView) findViewById(R.id.listView);
  57. recyclerView.setHasFixedSize(false);
  58.  
  59. layoutManager = new LinearLayoutManager(this);
  60. recyclerView.setLayoutManager(layoutManager);
  61.  
  62. myAdapter = new MyAdapter(songsList);
  63. recyclerView.setAdapter(myAdapter);
  64.  
  65. RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
  66. recyclerView.setItemAnimator(itemAnimator);
  67. }
  68.  
  69. public void onClick(View view) {
  70. songsList.add(song4);
  71. myAdapter.addItem(song4);
  72. songsList.add(song5);
  73. myAdapter.addItem(song5);
  74. songsList.add(song6);
  75. myAdapter.addItem(song6);
  76.  
  77. songsList.remove(song1);
  78. myAdapter.removeItem(1);
  79. songsList.remove(song2);
  80. myAdapter.removeItem(2);
  81.  
  82. myAdapter.notifyDataSetChanged();
  83. }
  84. }

适配器:

  1. public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
  2. private List<Song> songList;
  3.  
  4. public MyAdapter(List<Song> songList) {
  5. this.songList = songList;
  6. }
  7.  
  8. @Override
  9. public ViewHolder onCreateViewHolder(ViewGroup viewGroup,int i) {
  10. View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);
  11. return new ViewHolder(v);
  12. }
  13.  
  14. @Override
  15. public void onBindViewHolder(ViewHolder viewHolder,int i) {
  16. Song song = songList.get(i);
  17. viewHolder.song.setText(song.getName());
  18. viewHolder.author.setText(song.getAuthor());
  19. }
  20.  
  21. @Override
  22. public int getItemCount() {
  23. return songList.size();
  24. }
  25.  
  26. public void removeItem(int position) {
  27. songList.remove(position);
  28. notifyItemRemoved(position);
  29. }
  30.  
  31. public void addItem(Song song) {
  32. songList.add(song);
  33. notifyItemInserted(songList.size());
  34. }
  35.  
  36. class ViewHolder extends RecyclerView.ViewHolder {
  37. private TextView song;
  38. private TextView author;
  39.  
  40. public ViewHolder(View itemView) {
  41. super(itemView);
  42. song = (TextView) itemView.findViewById(R.id.tvSong);
  43. author = (TextView) itemView.findViewById(R.id.tvAuthor);
  44. }
  45. }
  46. }

Song类包括字段int id,String Name,String Author,getter和setter方法.

解决方法

>不要在onClick()中使用notifyDataSetChanged(),它会 随时取消所有动画. >你的add / removeItem()/包括notifyItemInserted / Removed(),所以请每次添加/删除单个项目,这样动画才能正常播放.如果要同时添加/删除多个项目,请在完成所有数据集的添加/删除后使用notifyItemRangeInserted / Removed(int startPos,int itemsSize).

猜你在找的Android相关文章