package support.ui.adapters;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
import support.ui.adapters.debounced.DebouncedOnClickListener;
import support.ui.adapters.debounced.DebouncedOnLongClickListener;
import static support.ui.adapters.EasyViewHolder.OnItemClickListener;
import static support.ui.adapters.EasyViewHolder.OnItemLongClickListener;
public class EasyRecyclerAdapter extends RecyclerView.Adapter<EasyViewHolder> {
private List<Object> dataList = new ArrayList<>();
private BaseEasyViewHolderFactory viewHolderFactory;
private OnItemClickListener itemClickListener;
private OnItemLongClickListener longClickListener;
public EasyRecyclerAdapter(Context context, Class valueClass,
Class<? extends EasyViewHolder> easyViewHolderClass) {
this(context);
bind(valueClass, easyViewHolderClass);
}
public EasyRecyclerAdapter(Context context) {
this(new BaseEasyViewHolderFactory(context));
}
public EasyRecyclerAdapter(BaseEasyViewHolderFactory easyViewHolderFactory, Class valueClass,
Class<? extends EasyViewHolder> easyViewHolderClass) {
this(easyViewHolderFactory);
bind(valueClass, easyViewHolderClass);
}
public void viewHolderFactory(BaseEasyViewHolderFactory easyViewHolderFactory) {
this.viewHolderFactory = easyViewHolderFactory;
}
public EasyRecyclerAdapter(BaseEasyViewHolderFactory easyViewHolderFactory) {
this.viewHolderFactory = easyViewHolderFactory;
}
public void bind(Class valueClass, Class<? extends EasyViewHolder> viewHolder) {
viewHolderFactory.bind(valueClass, viewHolder);
}
@Override
public EasyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
EasyViewHolder easyViewHolder = viewHolderFactory.create(viewType, parent);
bindListeners(easyViewHolder);
return easyViewHolder;
}
protected void bindListeners(EasyViewHolder easyViewHolder) {
if (easyViewHolder != null) {
easyViewHolder.setItemClickListener(itemClickListener);
easyViewHolder.setLongClickListener(longClickListener);
}
}
@SuppressWarnings("unchecked") @Override
public void onBindViewHolder(EasyViewHolder holder, int position) {
holder.bindTo(position, dataList.get(position));
}
@Override
public int getItemViewType(int position) {
return viewHolderFactory.itemViewType(dataList.get(position));
}
@Override
public int getItemCount() {
return dataList.size();
}
public void add(Object object, int position) {
dataList.add(position, object);
notifyItemInserted(position);
}
public void add(Object object) {
dataList.add(object);
notifyItemInserted(getIndex(object));
}
public void addAll(List<?> objects) {
dataList.clear();
appendAll(objects);
}
public void appendAll(List<?> objects) {
if (objects == null) {
throw new IllegalArgumentException("objects can not be null");
}
List<?> toAppends = filter(objects);
final int toAppendSize = toAppends.size();
if (toAppendSize <= 0) {
return;
}
int prevSize = this.dataList.size();
List<Object> data = new ArrayList<>(prevSize + toAppendSize);
data.addAll(dataList);
data.addAll(toAppends);
dataList = data;
notifyItemRangeInserted(prevSize, toAppends.size());
}
/**
* 去掉重复数据
*/
private List<?> filter(List<?> data) {
List<Object> returnData = new ArrayList<>();
List<?> localDataList = this.dataList;
for (Object o : data) {
if (!localDataList.contains(o)) {
returnData.add(o);
}
}
return returnData;
}
public boolean update(Object data, int position) {
Object oldData = dataList.set(position, data);
if (oldData != null) {
notifyItemChanged(position);
}
return oldData != null;
}
public boolean remove(Object data) {
return dataList.contains(data) && remove(getIndex(data));
}
public boolean remove(int position) {
boolean validIndex = isValidIndex(position);
if (validIndex) {
dataList.remove(position);
notifyItemRemoved(position);
}
return validIndex;
}
public void clear() {
dataList.clear();
notifyDataSetChanged();
}
public List<Object> getItems() {
return dataList;
}
public Object get(int position) {
return dataList.get(position);
}
public int getIndex(Object item) {
return dataList.indexOf(item);
}
public boolean isEmpty() {
return getItemCount() == 0;
}
public void setOnClickListener(final OnItemClickListener listener) {
this.itemClickListener = new DebouncedOnClickListener() {
@Override
public boolean onDebouncedClick(View v, int position) {
if (listener != null) {
listener.onItemClick(position, v);
}
return true;
}
};
}
public void setOnLongClickListener(final OnItemLongClickListener listener) {
this.longClickListener = new DebouncedOnLongClickListener() {
@Override
public boolean onDebouncedClick(View v, int position) {
return listener != null && listener.onLongItemClicked(position, v);
}
};
}
private boolean isValidIndex(int position) {
return position >= 0 && position < getItemCount();
}
}