package com.fastaccess.ui.widgets.recyclerview;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import com.fastaccess.helper.AnimHelper;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Kosh on 17 May 2016, 7:10 PM
*/
public abstract class BaseRecyclerAdapter<M, VH extends BaseViewHolder,
P extends BaseViewHolder.OnItemClickListener<M>> extends RecyclerView.Adapter<VH> {
@NonNull private List<M> data;
@Nullable public P listener;
private int lastKnowingPosition = -1;
private boolean enableAnimation = true;
public BaseRecyclerAdapter() {
this(new ArrayList<M>());
}
public BaseRecyclerAdapter(@NonNull List<M> data) {
this(data, null);
}
public BaseRecyclerAdapter(@NonNull List<M> data, @Nullable P listener) {
this.data = data;
this.listener = listener;
}
protected abstract VH viewHolder(ViewGroup parent, int viewType);
protected abstract void onBindView(VH holder, int position);
@NonNull public List<M> getData() {
return data;
}
public M getItem(int position) {
return data.get(position);
}
public int getItem(M t) {
return data.indexOf(t);
}
@Override public VH onCreateViewHolder(ViewGroup parent, int viewType) {
return viewHolder(parent, viewType);
}
@Override public void onBindViewHolder(VH holder, int position) {
animate(holder);
onBindView(holder, position);
}
@Override public int getItemCount() {
return data.size();
}
private void animate(VH holder) {
int position = holder.getLayoutPosition();
if (isEnableAnimation() /*&& position > lastKnowingPosition*/) {
AnimHelper.startBeatsAnimation(holder.itemView);
lastKnowingPosition = position;
}
}
public void insertItems(List<M> items) {
data.clear();
addItems(items);
}
public void addItem(M item) {
addItem(item, getItemCount());
}
public void addItem(M item, int position) {
data.add(position, item);
notifyItemInserted(position);
}
public void addItems(List<M> items) {
data.addAll(items);
notifyDataSetChanged();
}
public void removeItem(int position) {
data.remove(position);
notifyItemRemoved(position);
}
public void removeItem(M item) {
int position = data.indexOf(item);
removeItem(position);
}
public void removeItems(List<M> items) {
// int prevSize = data.size();
data.removeAll(items);
notifyDataSetChanged();
// notifyItemRangeRemoved(prevSize, Math.abs(data.size() - prevSize));
}
public void swapItem(M model) {
int index = getItem(model);
swapItem(model, index);
}
public void swapItem(M model, int position) {
data.set(position, model);
notifyDataSetChanged();
}
public void clear() {
data.clear();
notifyItemRangeRemoved(0, getItemCount());
}
public void setEnableAnimation(boolean enableAnimation) {
this.enableAnimation = enableAnimation;
notifyDataSetChanged();
}
public boolean isEnableAnimation() {
return enableAnimation;
}
}