Android 动画回收视图不工作
我试图用动画制作一个简单的RecyclerView示例,但默认动画不起作用。为什么呢?这里少了什么 主要活动: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
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)
。它起作用了。但是你能解释一下它是如何工作的吗?