package com.mcxtzhang.zxtcommonlib.recyclerview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
/**
* 通用的RecyclerView 的Adapter
* Created by zhangxutong .
* Date: 16/03/11
*/
public abstract class CommonAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
protected Context mContext;
protected int mLayoutId;
protected List<T> mDatas;
protected LayoutInflater mInflater;
protected ViewGroup mRv;//add by zhangxutong 2016 08 05 ,for 点击事件为了兼容HeaderView FooterView 的Adapter
private OnItemClickListener mOnItemClickListener;
public CommonAdapter setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.mOnItemClickListener = onItemClickListener;
return this;
}
public OnItemClickListener getmOnItemClickListener() {
return mOnItemClickListener;
}
public CommonAdapter(Context context, int layoutId, List<T> datas) {
mContext = context;
mInflater = LayoutInflater.from(context);
mLayoutId = layoutId;
mDatas = datas;
}
@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
Log.d("zxt", "onCreateViewHolder() called with: parent = [" + parent + "], viewType = [" + viewType + "]");
ViewHolder viewHolder = ViewHolder.get(mContext, null, parent, mLayoutId, -1);
//add by zhangxutong 2016 08 05 begin ,for 点击事件为了兼容HeaderView FooterView 的Adapter
if (null == mRv) {
mRv = parent;
}
//setListener(parent, viewHolder, viewType);
//add by zhangxutong 2016 08 05 end ,for 点击事件为了兼容HeaderView FooterView 的Adapter
return viewHolder;
}
protected int getPosition(RecyclerView.ViewHolder viewHolder) {
return viewHolder.getAdapterPosition();
}
protected boolean isEnabled(int viewType) {
return true;
}
/**
* 在onCreateHolder里调用的,但是在增加了HeaderFooter后,postion位置,会不正确。
* 所以如果使用了{@link HeaderAndFooterWrapperAdapter},建议使用 {@link #setListener(int, ViewHolder)} 这个方法,返回的位置是正确的。
*
* @param parent
* @param viewHolder
* @param viewType
*/
@Deprecated
protected void setListener(final ViewGroup parent, final ViewHolder viewHolder, int viewType) {
if (!isEnabled(viewType)) return;
viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
int position = getPosition(viewHolder);
mOnItemClickListener.onItemClick(parent, v, mDatas.get(position), position);
}
}
});
viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mOnItemClickListener != null) {
int position = getPosition(viewHolder);
return mOnItemClickListener.onItemLongClick(parent, v, mDatas.get(position), position);
}
return false;
}
});
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//Log.d("zxt", "onBindViewHolder() called with: holder = [" + holder + "], position = [" + position + "]");
holder.updatePosition(position);
//add by zhangxutong 2016 08 05 begin 点击事件为了兼容HeaderView FooterView 的Adapter,所以在OnBindViewHolder里,其实性能没有onCreate好
setListener(position, holder);
//add by zhangxutong 2016 08 05 end
convert(holder, mDatas.get(position));
}
//add by zhangxutong 2016 08 05 begin 点击事件为了兼容HeaderView FooterView 的Adapter,所以在OnBindViewHolder里,其实性能没有onCreate好
protected void setListener(final int position, final ViewHolder viewHolder) {
if (!isEnabled(getItemViewType(position))) return;
viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(mRv, v, mDatas.get(position), position);
}
}
});
viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mOnItemClickListener != null) {
int position = getPosition(viewHolder);
return mOnItemClickListener.onItemLongClick(mRv, v, mDatas.get(position), position);
}
return false;
}
});
}
public abstract void convert(ViewHolder holder, T t);
@Override
public int getItemCount() {
return mDatas != null ? mDatas.size() : 0;
}
/**
* 刷新数据,初始化数据
*
* @param list
*/
public void setDatas(List<T> list) {
if (this.mDatas != null) {
if (null != list) {
List<T> temp = new ArrayList<>();
temp.addAll(list);
this.mDatas.clear();
this.mDatas.addAll(temp);
} else {
this.mDatas.clear();
}
} else {
this.mDatas = list;
}
notifyDataSetChanged();
}
/**
* 删除数据
*
* @param i
*/
public void remove(int i) {
if (null != mDatas && mDatas.size() > i && i > -1) {
mDatas.remove(i);
notifyDataSetChanged();
}
}
/**
* 加载更多数据
*
* @param list
*/
public void addDatas(List<T> list) {
if (null != list) {
List<T> temp = new ArrayList<>();
temp.addAll(list);
if (this.mDatas != null) {
this.mDatas.addAll(temp);
} else {
this.mDatas = temp;
}
notifyDataSetChanged();
}
}
public List<T> getDatas() {
return mDatas;
}
public T getItem(int position) {
if (position > -1 && null != mDatas && mDatas.size() > position) {
return mDatas.get(position);
}
return null;
}
}