前言
RecyclerView提升性能很重要的一点就是支持局部更新效果,以前的ListView如果修改了数据通常要调用notifyDatasetChanged导致整个ListView内的布局都要重新刷新,现在RecyclerView除了全部刷新的方法之外还提供了单项、多条数据更新的回调方法。
增删改交换
方法 | 意义 |
---|---|
notifyItemInserted(int item) | 通知增加了单条数据 |
notifyItemRemoved(int item) | 通知删除了单条数据 |
notifyItemChanged(int item) | 通知修改了单条数据 |
notifyItemMoved(int from, int to) | 通知移动了两条数据 |
notifyItemRangeInserted(int pos, int count) | 通知增加了一批数据 |
notifyItemRangeRemoved(int pos, int count) | 通知删除了一批数据 |
notifyDataSetChanged() | 通知所有的数据发生了变化,前面的更新方式都有动画效果(如果用户设置了),这种更新方式没有动画效果 |
DiffUtils整体绑定
DiffUtils是Android7.0新引入的工具,用来对比当前的旧数据和新得到的数据之间的差异,最后通过上面的各种通知操作完成更新,这种实现优点在数据基本上相同的情况下只更新修改的少量数据,不必对整体的列表数据做刷新操作,而且还支持数据的刷新的各种动画效果。实现时首先需要定义对比新旧数据的回调接口,然后工具计算会返回差异结果,最后将差异结果提交个Adapter来刷新RecyclerView,刷新的时候发现数据有变化的条目所有的控件都会被重新设置内容,所以也就是整体绑定,如果用户希望只设置内容改变的控件可以使用后面提到的部分绑定。
// RecyclerView.Adapter的子类方法,负责更新所有数据
public void replace() {
this.data = userList;
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.Callback() {
// 旧数据的数量
@Override
public int getOldListSize() {