package org.mercury_im.messenger.ui.util; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.List; public abstract class AbstractRecyclerViewAdapter extends RecyclerView.Adapter { private final List models = new ArrayList<>(); private final AbstractDiffCallback diffCallback; public AbstractRecyclerViewAdapter(AbstractDiffCallback diffCallback) { this.diffCallback = diffCallback; } public void setModels(List newModels) { diffCallback.setData(this.models, newModels); DiffUtil.DiffResult delta = DiffUtil.calculateDiff(diffCallback, diffCallback.detectMoves); this.models.clear(); this.models.addAll(newModels); delta.dispatchUpdatesTo(this); } public List getModels() { return models; } public M getItemAt(int position) { return getModels().get(position); } @Override public int getItemCount() { return models.size(); } public abstract static class AbstractDiffCallback extends DiffUtil.Callback { private List oldData; private List newData; private boolean detectMoves; public AbstractDiffCallback(boolean detectMoves) { this.detectMoves = detectMoves; } public void setData(List oldData, List newData) { this.oldData = oldData; this.newData = newData; } public I oldItemAt(int index) { return oldData.get(index); } public I newItemAt(int index) { return newData.get(index); } @Override public int getOldListSize() { return oldData.size(); } @Override public int getNewListSize() { return newData.size(); } @Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { return areItemsTheSame(oldItemAt(oldItemPosition), newItemAt(newItemPosition)); } public abstract boolean areItemsTheSame(I oldItem, I newItem); @Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { return areContentsTheSame(oldItemAt(oldItemPosition), newItemAt(newItemPosition)); } public abstract boolean areContentsTheSame(I oldItem, I newItem); } }