一. BaseViewHolder
public class BaseViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> mViewArray;
public BaseViewHolder(View view) {
super(view);
mViewArray = new SparseArray<>();
}
public BaseViewHolder(ViewGroup parent,int layotID){
this(LayoutInflater.from(parent.getContext()).inflate(layotID,parent,false));
}
protected <T extends View> T getView(int viewID){
View view = mViewArray.get(viewID);
if (view == null) {
view = itemView.findViewById(viewID);
mViewArray.put(viewID, view);
}
return (T) view;
}
protected Context getContext(){
return itemView.getContext();
}
public BaseViewHolder setText(int viewId, CharSequence value) {
TextView view = getView(viewId);
view.setText(value);
return this;
}
}
二.AsbAdapter
public abstract class AbsAdapter<VH extends BaseViewHolder> extends RecyclerView.Adapter<BaseViewHolder> {
public static final int VIEW_TYPE_HEADER = 1024;
public static final int VIEW_TYPE_FOOTER = 1025;
protected View mHeaderView;
protected View mFooterView;
protected Context mContext;
public AbsAdapter(Context context) {
this.mContext = context;
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == VIEW_TYPE_HEADER) {
return new BaseViewHolder(mHeaderView);
} else if (viewType == VIEW_TYPE_FOOTER) {
return new BaseViewHolder(mFooterView);
}else {
return createCustomViewHolder(parent,viewType);
}
}
/***
* 创建自定义的ViewHolder
* @param parent
* @param viewType
* @return
*/
public abstract VH createCustomViewHolder(ViewGroup parent, int viewType);
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case VIEW_TYPE_HEADER:
case VIEW_TYPE_FOOTER:
break;
default:
bindCoustomViewHolder((VH) holder,position);
break;
}
}
/***
* 绑定自定义的ViewHolder
* @param holder
* @param position
*/
public abstract void bindCoustomViewHolder(VH holder,int position);
public void addHeaderView(View headerView){
if (null == headerView)return;
this.mHeaderView = headerView;
notifyDataSetChanged();
}
public void removeHeaderView(){
if (mHeaderView !=null){
mHeaderView = null;
notifyDataSetChanged();
}
}
public void addFooterView(View footerView){
if (null == footerView)return;
this.mFooterView = footerView;
notifyDataSetChanged();
}
public void removeFooterView(){
if (mFooterView !=null){
mFooterView =null;
notifyDataSetChanged();
}
}
/***
* 获取附加View的数量,包括HeaderView和FooterView
* @return
*/
public int getExtraViewCount(){
int extraViewCount =0;
if (mHeaderView !=null){
extraViewCount ++;
}
if (mFooterView !=null){
extraViewCount ++;
}
return extraViewCount;
}
public int getHeaderExtraViewCount(){
return mHeaderView ==null?0:1;
}
public int getFooterExtraViewCount(){
return mFooterView ==null?0:1;
}
}
三.BaseAdapter
public abstract class BaseAdapter<M,VH extends BaseViewHolder> extends AbsAdapter { private List<M> mDataList; public BaseAdapter(Context context) { this(context,null); } public BaseAdapter(Context context,List<M>list) { super(context); if (list !=null){ this.mDataList = list; }else { mDataList = new ArrayList<>(); } } /*** * 填充数据,此操作会清除原来的数据 * @param list */ public void fillList(List<M> list){ mDataList.clear(); boolean result = mDataList.addAll(list); if (result) notifyDataSetChanged(); } /*** * 追加一条数据 * @param data */ public void appendItem(M data){ mDataList.add(data); int size = mDataList.size(); if (getHeaderExtraViewCount() ==0){ notifyItemInserted(size -1); }else { notifyItemInserted(size); } } public boolean isContains(M data){ return mDataList.contains(data); } /*** * 追加集合数据 * @param list */ public void appendList(List<M> list){ mDataList.addAll(list); notifyDataSetChanged(); } /** * 置顶某条数据 * @param data */ public void proposeItem(M data){ mDataList.add(0,data); notifyItemInserted(getHeaderExtraViewCount() ==0?0:getHeaderExtraViewCount()); } /*** * 置顶集合数据 * @param list */ public void proposeLlist(List<M> list){ mDataList.addAll(0,list); notifyDataSetChanged(); } public void removeItem(int position){ mDataList.remove(getHeaderExtraViewCount() ==0?position:position-1); notifyItemRemoved(position); } public void removeItem(M data){ int index = mDataList.indexOf(data); if (index<0){ return; } mDataList.remove(index); notifyItemRemoved(getHeaderExtraViewCount() ==0?index:index +1); } public void updateItem(M data){ int index = mDataList.indexOf(data); if (index <0){ return; } mDataList.set(index,data); notifyItemChanged(mHeaderView ==null?index:index+1); } public void clear(){ mDataList.clear(); notifyDataSetChanged(); } public M getItem(int position){ if ((mHeaderView !=null && position ==0)||(position>=mDataList.size() +getHeaderExtraViewCount())){ return null; } return mHeaderView == null ? mDataList.get(position) : mDataList.get(position - 1); } public M getItem(VH holder){ return getItem(holder.getAdapterPosition()); } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { if (mHeaderView !=null && position ==0){ return VIEW_TYPE_HEADER; }else if (mFooterView !=null&& position==mDataList.size() +getHeaderExtraViewCount()){ return VIEW_TYPE_FOOTER; }else { return getCustomViewType(position); } } protected abstract int getCustomViewType(int position); @Override public int getItemCount() { return getExtraViewCount() +mDataList.size(); } }