In Support Library Review 24.2.0, one of the updates was the addition of the class Diffutil.
It makes it possible to calculate the difference between two collections and obtain an object of the type Diffutil.Diffresult which contains a list of upgrade operations to be applied to a Recyclerview.Adapter.
Operations shall be implemented using the Diffresult#dispatchUpdatesTo() that internally uses the methods notifyItemXXX()
to notify the Adapter.
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(callback);
diffResult.dispatchUpdatesTo(adapter);
Diffutil needs to get some information about the old and new collection, such as size and how to compare items. This information is obtained using Diffutil.Callback passed to the method Diffutil.calculateDiff().
The implementation of callback depends on the type the collection holds.
Example of implementation:
public class ProdutoDiffCallback extends DiffUtil.Callback{
List<Produto> oldProdutos;
List<Produto> newProdutos;
public ProdutoDiffCallback(List<Produto> newProdutos, List<Produto> oldProdutos) {
this.newProdutos = newProdutos;
this.oldProdutos = oldProdutos;
}
@Override
public int getOldListSize() {
return oldProdutos.size();
}
@Override
public int getNewListSize() {
return newProdutos.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldProdutos.get(oldItemPosition).id == newProdutos.get(newItemPosition).id;
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return oldProdutos.get(oldItemPosition).equals(newProdutos.get(newItemPosition));
}
}
The Recyclerview upgrade can be implemented in an Adapter method as follows:
public void updateList(ArrayList<Produto> newProdutos) {
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new ProdutoDiffCallback(this.Produtos, newProduto));
this.Produtos = newProdutos
diffResult.dispatchUpdatesTo(this);
}