说明
分两个Adapter
一个用于专门显示的Adapter,
另一个用于刷新的Adapter。
用于显示的Adapter
集成QuickAdapter,是自己封装的一个Adpater,正常的显示数据,跟平时的逻辑一样
刷新的Adapter
HeaderAndFooterRecyclerViewAdapter
这个将显示的Adapter包裹在其中,刷新的Adapter用于逻辑的处理,也就是嵌套调用。
QuickAdapter源代码
public abstract class QuickAdapter<T> extends RecyclerView.Adapter<VH> {
private List<T> mDatas;
// protected OnItemClickListener<T> mItemClickListener;
protected OnNoDoubleClickListener mOnClickListener;
public QuickAdapter() {
mDatas = new ArrayList<>();
}
public QuickAdapter(List<T> mDatas) {
this.mDatas = mDatas;
}
public void setDatas(List<T> mDatas) {
this.mDatas = mDatas;
}
public void addDatas(List<T> newDatas) {
if (mDatas == null) {
mDatas = new ArrayList<T>();
}
mDatas.addAll(newDatas);
}
public List<T> getDatas() {
if (this.mDatas == null) {
this.mDatas = new ArrayList<>();
}
return this.mDatas;
}
@NonNull
@Override
public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = IStarViewUtils.inflate(getItemLayoutId(viewType), parent);
final VH holder = new VH(itemView);
return holder;
}
// public void setItemClickListener(OnItemClickListener<T> itemClickListener) {
// mItemClickListener = itemClickListener;
// }
@Override
public void onBindViewHolder(@NonNull VH holder, int position) {
onBindViewHolder(holder, mDatas.get(position), position);
}
public abstract void onBindViewHolder(VH holder, T data, int position);
public abstract int getItemLayoutId(int viewType);
@Override
public int getItemCount() {
return (mDatas == null) ? 0 : mDatas.size();
}
public <T> void setOnClickListener(OnNoDoubleClickListener<T> onClickListener) {
this.mOnClickListener = onClickListener;
}
public void addOnClickListener(View mView, int resId, final T t) {
IStarViewUtils.setOnClickListener(mView, resId, new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnClickListener != null) {
try {
mOnClickListener.onClick(v, t);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
public void addOnClickListener(View mView, final T t) {
IStarViewUtils.setOnClickListener(mView, new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnClickListener != null) {
try {
mOnClickListener.onClick(v, t);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
}
HeaderAndFooterRecyclerViewAdapter源代码
/**
* Created by cundong on 2015/10/9.11
* <p/>
* RecyclerView.Adapter with Header and Footer
*/
public class HeaderAndFooterRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int TYPE_HEADER_VIEW = -2147483648;
public static final int TYPE_NORMAL_VIEW = -2147483648 + 2;
public static final int TYPE_FOOTER_VIEW = -2147483648 + 1;
/**
* RecyclerView使用的,真正的Adapter
*/
private RecyclerView.Adapter<RecyclerView.ViewHolder> mInnerAdapter;
private ArrayList<View> mHeaderViews = new ArrayList<>();
private ArrayList<View> mFooterViews = new ArrayList<>();
private RecyclerView mRecyclerView;
private RecyclerView.LayoutManager mLayoutManager;
private RecyclerView.AdapterDataObserver mDataObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
notifyDataSetChanged();
}
@Override
public void onItemRangeChanged(int positionStart, int itemCount) {
super.onItemRangeChanged(positionStart, itemCount);
notifyItemRangeChanged(positionStart + getHeaderViewsCount(), itemCount);
}
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
notifyItemRangeInserted(positionStart + getHeaderViewsCount(), itemCount);
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
super.onItemRangeRemoved(positionStart, itemCount);
notifyItemRangeRemoved(positionStart + getHeaderViewsCount(), itemCount);
}
@Override
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
super.onItemRangeMoved(fromPosition, toPosition, itemCount);
int headerViewsCountCount = getHeaderViewsCount();
notifyItemRangeChanged(fromPosition + headerViewsCountCount, toPosition + headerViewsCountCount + itemCount);
}
};
public HeaderAndFooterRecyclerViewAdapter() {
}
public HeaderAndFooterRecyclerViewAdapter(RecyclerView.Adapter innerAdapter) {
setAdapter(innerAdapter);
}
public HeaderAndFooterRecyclerViewAdapter(RecyclerView.Adapter innerAdapter, boolean sticky) {
setAdapter(innerAdapter);
}
/**
* 设置adapter
*
* @param adapter
*/
public void setAdapter(RecyclerView.Adapter<RecyclerView.ViewHolder> adapter) {
if (adapter != null) {
if (!(adapter instanceof RecyclerView.Adapter))
throw new RuntimeException("your adapter must be a RecyclerView.Adapter");
}
if (mInnerAdapter != null) {
notifyItemRangeRemoved(getHeaderViewsCount(), mInnerAdapter.getItemCount());
mInnerAdapter.unregisterAdapterDataObserver(mDataObserver);
}
this.mInnerAdapter = adapter;
mInnerAdapter.registerAdapterDataObserver(mDataObserver);
notifyItemRangeInserted(getHeaderViewsCount(), mInnerAdapter.getItemCount());
}
public RecyclerView.Adapter getInnerAdapter() {
return mInnerAdapter;
}
public void addHeaderView(View header) {
if (header == null) {
throw new RuntimeException("header is null");
}
mHeaderViews.add(header);
this.notifyDataSetChanged();
}
public void addFooterView(View footer) {
if (footer == null) {
throw new RuntimeException("footer is null");
}
mFooterViews.add(footer);
this.notifyDataSetChanged();
}
/**
* 返回第一个FoView
*
* @return
*/
public View getFooterView() {
return getFooterViewsCount() > 0 ? mFooterViews.get(0) : null;
}
/**
* 返回第一个HeaderView
*
* @return
*/
public View getHeaderView() {
return getHeaderViewsCount() > 0 ? mHeaderViews.get(0) : null;
}
public void removeHeaderView(View view) {
mHeaderViews.remove(view);
this.notifyDataSetChanged();
}
public void removeFooterView(View view) {
mFooterViews.remove(view);
this.notifyDataSetChanged();
}
public int getHeaderViewsCount() {
return mHeaderViews.size();
}
public int getFooterViewsCount() {
return mFooterViews.size();
}
public boolean isHeader(int position) {
return getHeaderViewsCount() > 0 && position == 0;
}
public boolean isFooter(int position) {
int lastPosition = getItemCount() - 1;
return getFooterViewsCount() > 0 && position == lastPosition;
}
// 获取HeaderView的类型
public static int getHeaderViewType(int position) {
return TYPE_HEADER_VIEW + position;
}
// 后去FooterView的类型
public int getFooterViewType(int position) {
return TYPE_FOOTER_VIEW + position - mInnerAdapter.getItemCount();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
int headerViewsCount = getHeaderViewsCount();
if (viewType < TYPE_HEADER_VIEW + headerViewsCount) {
return new ViewHolder(mHeaderViews.get(viewType - TYPE_HEADER_VIEW));
} else if (viewType >= headerViewsCount + TYPE_FOOTER_VIEW && viewType < TYPE_FOOTER_VIEW + getItemCount()) {
return new ViewHolder(mFooterViews.get(viewType - TYPE_FOOTER_VIEW - headerViewsCount));
} else {
return mInnerAdapter.onCreateViewHolder(parent, viewType);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int headerViewsCountCount = getHeaderViewsCount();
if (position >= headerViewsCountCount && position < headerViewsCountCount + mInnerAdapter.getItemCount()) {
mInnerAdapter.onBindViewHolder(holder, position - headerViewsCountCount);
} else {
ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
((StaggeredGridLayoutManager.LayoutParams) layoutParams).setFullSpan(true);
} else if (layoutParams == null && mLayoutManager instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager.LayoutParams lp = new StaggeredGridLayoutManager.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT);
lp.setFullSpan(true);
holder.itemView.setLayoutParams(lp);
}
}
}
@Override
public int getItemCount() {
return getHeaderViewsCount() + getFooterViewsCount() + mInnerAdapter.getItemCount();
}
public boolean isHeaderMoreThanFooter() {
int headerViewsCount = getHeaderViewsCount();
int footerViewsCount = getFooterViewsCount();
return headerViewsCount > footerViewsCount;
}
// 最大的那个计数, 避免冲突
public int getRangeCount() {
int headerViewsCount = getHeaderViewsCount();
int footerViewsCount = getFooterViewsCount();
if (headerViewsCount > footerViewsCount) {
return headerViewsCount;
} else {
return footerViewsCount;
}
}
@Override
public int getItemViewType(int position) {
int headerViewsCount = getHeaderViewsCount();
if (position < headerViewsCount) {
return getHeaderViewType(position);
} else if (position < headerViewsCount + mInnerAdapter.getItemCount()) {
return mInnerAdapter.getItemViewType(position - getHeaderViewsCount());
} else {
return getFooterViewType(position);
}
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
}
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
mInnerAdapter.onAttachedToRecyclerView(recyclerView);
if (mLayoutManager == null) {
mLayoutManager = recyclerView.getLayoutManager();
}
}
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
super.onViewAttachedToWindow(holder);
if (mLayoutManager == null && mRecyclerView != null) {
mLayoutManager = mRecyclerView.getLayoutManager();
}
}
}