我试图用动画制作一个简单的例子RecyclerView,但默认动画不起作用。这是为什么?这里缺少什么?
主要活动:
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();
}
}
适配器:
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);
}
}
}
类Song包括字段int id,String Name,String Author,getter和setter方法。
答案 0 :(得分:7)
notifyDataSetChanged()
随时取消所有动画。onClick()
包含add/removeItem()/
,因此请每次添加/删除单个项目,这样动画才能正常播放。如果您想同时添加/删除多个项目,请在完成所有数据集的添加/删除后使用notifyItemInserted/Removed()
。答案 1 :(得分:6)
覆盖适配器中的getItemId(int position)
方法,并在构造函数中调用setHasStableIds(true)
,例如。