package com.yuyh.easyadapter.recyclerview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.yuyh.easyadapter.helper.DataHelper;
import java.util.List;
/**
* https://github.com/smuyyh/EasyAdapter
*
* @author yuyh.
* @date 2016/7/21.
*/
public abstract class EasyRVAdapter<T> extends RecyclerView.Adapter<EasyRVHolder> implements DataHelper<T> {
protected Context mContext;
protected List<T> mList;
protected int[] layoutIds;
protected LayoutInflater mLInflater;
private SparseArray<View> mConvertViews = new SparseArray<>();
public EasyRVAdapter(Context context, List<T> list, int... layoutIds) {
this.mContext = context;
this.mList = list;
this.layoutIds = layoutIds;
this.mLInflater = LayoutInflater.from(mContext);
}
@Override
public EasyRVHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType < 0 || viewType > layoutIds.length) {
throw new ArrayIndexOutOfBoundsException("layoutIndex");
}
if (layoutIds.length == 0) {
throw new IllegalArgumentException("not layoutId");
}
int layoutId = layoutIds[viewType];
View view = mConvertViews.get(layoutId);
if (view == null) {
view = mLInflater.inflate(layoutId, parent, false);
}
EasyRVHolder viewHolder = (EasyRVHolder) view.getTag();
if (viewHolder == null || viewHolder.getLayoutId() != layoutId) {
viewHolder = new EasyRVHolder(mContext, layoutId, view);
return viewHolder;
}
return viewHolder;
}
@Override
public void onBindViewHolder(EasyRVHolder holder, int position) {
final T item = mList.get(position);
onBindData(holder, position, item);
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
@Override
public int getItemViewType(int position) {
return getLayoutIndex(position, mList.get(position));
}
/**
* 指定item布局样式在layoutIds的索引。默认为第一个
*
* @param position
* @param item
* @return
*/
public int getLayoutIndex(int position, T item) {
return 0;
}
protected abstract void onBindData(EasyRVHolder viewHolder, int position, T item);
@Override
public boolean addAll(List<T> list) {
boolean result = mList.addAll(list);
notifyDataSetChanged();
return result;
}
@Override
public boolean addAll(int position, List list) {
boolean result = mList.addAll(position, list);
notifyDataSetChanged();
return result;
}
@Override
public void add(T data) {
mList.add(data);
notifyDataSetChanged();
}
@Override
public void add(int position, T data) {
mList.add(position, data);
notifyDataSetChanged();
}
@Override
public void clear() {
mList.clear();
notifyDataSetChanged();
}
@Override
public boolean contains(T data) {
return mList.contains(data);
}
@Override
public T getData(int index) {
return mList.get(index);
}
@Override
public void modify(T oldData, T newData) {
modify(mList.indexOf(oldData), newData);
}
@Override
public void modify(int index, T newData) {
mList.set(index, newData);
notifyDataSetChanged();
}
@Override
public boolean remove(T data) {
boolean result = mList.remove(data);
notifyDataSetChanged();
return result;
}
@Override
public void remove(int index) {
mList.remove(index);
notifyDataSetChanged();
}
}