场景
一般关于RecyclerView列表条目的增删改加动画的话 会考虑用itemAnimators
recyclerView.setItemAnimator(new ScaleInLeftAnimator());
adapter里会用到如下的几个方法:
- notifyItemInserted(int position)
- notifyItemRemoved(int position)
- notifyItemRangeChanged(int positionStart, int itemCount)
示例代码
public void add(String text, int position) {
mDataSet.add(position, text);
notifyItemInserted(position);
}
public void remove(int position) {
mDataSet.remove(position);
notifyItemRemoved(position);
}
public void changeData(List<String> datas) {
int len = mDataSet.size();
if (!mDataSet.isEmpty()) {
mDataSet.clear();
}
mDataSet.addAll(datas);
notifyItemRangeChanged(0,datas.size());
}
坑在哪
- 假如在position=1的位置,插入/删除/一条数据,ui上没啥问题。但是!!!
以add item举例,add后,原来positiom为1的item现在应该为2了,debug发现并没有,position还是1。 - notifyItemRangeChanged(0,datas.size()); 假如原本列表是50条数据,你批量替换数据为新的10条数据,不要直接这样用,这个方法只是item内容改变的时候用,不是完全替代notifyDataSetChanged();
解决方案
public void remove(int position) {
mDataSet.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position,mDataSet.size()-position);
}
public void add(String text, int position) {
mDataSet.add(position, text);
notifyItemInserted(position);
notifyItemRangeChanged(position,mDataSet.size()-position);
}
public void changeData(List<String> datas) {
int len = mDataSet.size();
if (!mDataSet.isEmpty()) {
mDataSet.clear();
}
mDataSet.addAll(datas);
notifyDataSetChanged();
//notifyItemRangeChanged(0,datas.size());//内容改变的时候用
}
最后
- 我没看源码,不是很懂google怎么想的,请懂的老铁指点迷津,比看源码快,万分感谢。
- 问题: 假如列表切换新的数据,想有change动画,又想用setItemAnimator的动画方式,该怎么用notifyItemRangeChanged() ???
- 写个帖子问题很多系列 哈哈哈