Android 动画回收视图不工作

Android 动画回收视图不工作,android,android-animation,android-recyclerview,Android,Android Animation,Android Recyclerview,我试图用动画制作一个简单的RecyclerView示例,但默认动画不起作用。为什么呢?这里少了什么 主要活动: public class MainActivity extends Activity { List<Song> songsList; RecyclerView recyclerView; MyAdapter myAdapter; RecyclerView.LayoutManager layoutManager; Song song1; Song song2; Song

我试图用动画制作一个简单的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();
}
}
公共类MainActivity扩展活动{
歌曲列表;
回收视图回收视图;
我的适配器我的适配器;
RecyclerView.LayoutManager LayoutManager;
宋松1;
宋松2;
宋松3;
宋松4;
宋松5;
宋松6;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
songsList=newarraylist();
song1=新歌();
歌曲1.集名(“标签1”);
歌曲1.集作者(“作者1”);
song1.setId(1);
song2=新歌();
song2.集合名(“Label2”);
歌曲2.集作者(“作者2”);
song2.setId(2);
song3=新歌();
song3.集合名(“Label3”);
歌曲3.集作者(“作者3”);
松树3.setId(3);
song4=新歌();
song4.集合名(“Label4”);
歌曲4.集作者(“作者4”);
松树4.setId(4);
song5=新歌();
歌曲5.集名(“标签5”);
歌曲5.setAuthor(“作者5”);
松树5.setId(5);
song6=新歌();
歌曲6.集名(“Label6”);
歌曲6.setAuthor(“作者6”);
松树6.setId(6);
歌曲列表。添加(歌曲1);
歌曲列表。添加(歌曲2);
歌曲列表。添加(歌曲3);
recyclerView=(recyclerView)findViewById(R.id.listView);
recyclerView.setHasFixedSize(false);
layoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(layoutManager);
myAdapter=新的myAdapter(歌曲列表);
recyclerView.setAdapter(myAdapter);
RecycleView.ItemAnimator ItemAnimator=新的DefaultItemAnimator();
setItemAnimator(itemAnimator);
}
公共void onClick(视图){
歌曲列表。添加(歌曲4);
myAdapter.addItem(song4);
歌曲列表。添加(歌曲5);
myAdapter.addItem(song5);
歌曲列表。添加(歌曲6);
myAdapter.addItem(song6);
歌曲列表。删除(歌曲1);
myAdapter.removeItem(1);
歌曲列表。删除(歌曲2);
myAdapter.removietem(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);
    }
}
}
公共类MyAdapter扩展了RecyclerView.Adapter{ 私人歌曲列表; 公共MyAdapter(歌曲列表){ this.songList=歌曲列表; } @凌驾 公共视图持有者onCreateViewHolder(视图组视图组,int i){ 视图v=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.item,viewGroup,false); 返回新的视图持有者(v); } @凌驾 公共无效onBindViewHolder(ViewHolder ViewHolder,int i){ 宋歌=歌曲列表。获取(i); viewHolder.song.setText(song.getName()); viewHolder.author.setText(song.getAuthor()); } @凌驾 public int getItemCount(){ 返回songList.size(); } 公共无效删除项(内部位置){ 歌曲列表。删除(位置); 已移除(位置)的项目; } 公共无效附加项(宋歌){ 歌曲列表。添加(歌曲); notifyItemInserted(songList.size()); } 类ViewHolder扩展了RecyclerView.ViewHolder{ 私用短信查看歌曲; 私有文本视图作者; 公共视图持有者(视图项视图){ 超级(项目视图); song=(TextView)itemView.findViewById(R.id.tvSong); author=(TextView)itemView.findViewById(R.id.tvAuthor); } } } 类Song包括int id、字符串名称、字符串作者、getter和setter方法字段

  • 不要在
    onClick()
    中使用
    notifyDataSetChanged()
    ,它会 随时取消所有动画
  • 您的
    add/removietem()/
    包括
    notifyItemInserted/Removed()
    ,因此请每次添加/删除单个项目,这样动画将正确播放。如果要同时添加/删除多个项目,请在完成所有数据集的添加/删除后使用
    notifyItemRangeInserted/Removed(int startPos,int itemsize)

  • 重写适配器中的
    getItemId(int-position)
    方法,并调用构造函数中的
    sethasstableId(true)

    它起作用了。但是你能解释一下它是如何工作的吗?