Mercury-IM/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter...

87 lines
2.4 KiB
Java
Raw Normal View History

2019-09-02 01:06:17 +02:00
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<M, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
private final List<M> models = new ArrayList<>();
private final AbstractDiffCallback<M> diffCallback;
public AbstractRecyclerViewAdapter(AbstractDiffCallback<M> diffCallback) {
this.diffCallback = diffCallback;
}
public void setModels(List<M> 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<M> getModels() {
return models;
}
2019-12-06 15:52:50 +01:00
public M getItemAt(int position) {
2019-09-02 01:06:17 +02:00
return getModels().get(position);
}
@Override
public int getItemCount() {
return models.size();
}
public abstract static class AbstractDiffCallback<I> extends DiffUtil.Callback {
2019-09-02 01:06:17 +02:00
private List<I> oldData;
private List<I> newData;
private boolean detectMoves;
public AbstractDiffCallback(boolean detectMoves) {
this.detectMoves = detectMoves;
}
public void setData(List<I> oldData, List<I> 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);
}
}