AdapterWrapper.java 源代码
package com.yanzhenjie.recyclerview;
import android.content.Context;
import android.support.v4.util.SparseArrayCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.lang.reflect.Field;
import java.util.List;
public class AdapterWrapper extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int BASE_ITEM_TYPE_FOOTER = 200000;
private static final int BASE_ITEM_TYPE_HEADER = 100000;
private RecyclerView.Adapter mAdapter;
private LayoutInflater mInflater;
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
private OnItemMenuClickListener mOnItemMenuClickListener;
private SwipeMenuCreator mSwipeMenuCreator;
private SparseArrayCompat<View> mHeaderViews = new SparseArrayCompat<>();
private SparseArrayCompat<View> mFootViews = new SparseArrayCompat<>();
@Override
public final void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
}
public AdapterWrapper(Context context, RecyclerView.Adapter adapter) {
this.mInflater = LayoutInflater.from(context);
this.mAdapter = adapter;
}
public RecyclerView.Adapter getOriginAdapter() {
return this.mAdapter;
}
public void setSwipeMenuCreator(SwipeMenuCreator swipeMenuCreator) {
this.mSwipeMenuCreator = swipeMenuCreator;
}
public void setOnItemMenuClickListener(OnItemMenuClickListener onItemMenuClickListener) {
this.mOnItemMenuClickListener = onItemMenuClickListener;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.mOnItemClickListener = onItemClickListener;
}
public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
this.mOnItemLongClickListener = onItemLongClickListener;
}
@Override
public int getItemCount() {
return getHeaderCount() + getContentItemCount() + getFooterCount();
}
private int getContentItemCount() {
return this.mAdapter.getItemCount();
}
@Override
public int getItemViewType(int i) {
if (isHeader(i)) {
return this.mHeaderViews.keyAt(i);
}
if (isFooter(i)) {
return this.mFootViews.keyAt((i - getHeaderCount()) - getContentItemCount());
}
return this.mAdapter.getItemViewType(i - getHeaderCount());
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = this.mHeaderViews.get(i);
if (view != null) {
return new ViewHolder(view);
}
View view2 = this.mFootViews.get(i);
if (view2 != null) {
return new ViewHolder(view2);
}
final RecyclerView.ViewHolder onCreateViewHolder = this.mAdapter.onCreateViewHolder(viewGroup, i);
if (this.mOnItemClickListener != null) {
onCreateViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view3) {
AdapterWrapper.this.mOnItemClickListener.onItemClick(view3, onCreateViewHolder.getAdapterPosition());
}
});
}
if (this.mOnItemLongClickListener != null) {
onCreateViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view3) {
AdapterWrapper.this.mOnItemLongClickListener.onItemLongClick(view3, onCreateViewHolder.getAdapterPosition());
return true;
}
});
}
if (this.mSwipeMenuCreator == null) {
return onCreateViewHolder;
}
View inflate = this.mInflater.inflate(R.layout.support_recycler_view_item, viewGroup, false);
((ViewGroup) inflate.findViewById(R.id.swipe_content)).addView(onCreateViewHolder.itemView);
try {
Field declaredField = getSupperClass(onCreateViewHolder.getClass()).getDeclaredField("itemView");
if (!declaredField.isAccessible()) {
declaredField.setAccessible(true);
}
declaredField.set(onCreateViewHolder, inflate);
} catch (Exception unused) {
}
return onCreateViewHolder;
}
private Class<?> getSupperClass(Class<?> cls) {
Class<? super Object> superclass = cls.getSuperclass();
return (superclass == null || superclass.equals(Object.class)) ? cls : getSupperClass(superclass);
}
@Override
public final void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i, List<Object> list) {
if (isHeaderOrFooter(viewHolder)) {
return;
}
View view = viewHolder.itemView;
int headerCount = i - getHeaderCount();
if ((view instanceof SwipeMenuLayout) && this.mSwipeMenuCreator != null) {
SwipeMenuLayout swipeMenuLayout = (SwipeMenuLayout) view;
SwipeMenu swipeMenu = new SwipeMenu(swipeMenuLayout);
SwipeMenu swipeMenu2 = new SwipeMenu(swipeMenuLayout);
this.mSwipeMenuCreator.onCreateMenu(swipeMenu, swipeMenu2, headerCount);
SwipeMenuView swipeMenuView = (SwipeMenuView) swipeMenuLayout.getChildAt(0);
if (swipeMenu.hasMenuItems()) {
swipeMenuView.setOrientation(swipeMenu.getOrientation());
swipeMenuView.createMenu(viewHolder, swipeMenu, swipeMenuLayout, 1, this.mOnItemMenuClickListener);
} else if (swipeMenuView.getChildCount() > 0) {
swipeMenuView.removeAllViews();
}
SwipeMenuView swipeMenuView2 = (SwipeMenuView) swipeMenuLayout.getChildAt(2);
if (swipeMenu2.hasMenuItems()) {
swipeMenuView2.setOrientation(swipeMenu2.getOrientation());
swipeMenuView2.createMenu(viewHolder, swipeMenu2, swipeMenuLayout, -1, this.mOnItemMenuClickListener);
} else if (swipeMenuView2.getChildCount() > 0) {
swipeMenuView2.removeAllViews();
}
}
this.mAdapter.onBindViewHolder(viewHolder, headerCount, list);
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
this.mAdapter.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int i) {
if (AdapterWrapper.this.isHeaderOrFooter(i)) {
return gridLayoutManager.getSpanCount();
}
GridLayoutManager.SpanSizeLookup spanSizeLookup2 = spanSizeLookup;
if (spanSizeLookup2 != null) {
return spanSizeLookup2.getSpanSize(i);
}
return 1;
}
});
}
}
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder viewHolder) {
if (isHeaderOrFooter(viewHolder)) {
ViewGroup.LayoutParams layoutParams = viewHolder.itemView.getLayoutParams();
if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
((StaggeredGridLayoutManager.LayoutParams) layoutParams).setFullSpan(true);
return;
}
return;
}
this.mAdapter.onViewAttachedToWindow(viewHolder);
}
public boolean isHeaderOrFooter(RecyclerView.ViewHolder viewHolder) {
if (viewHolder instanceof ViewHolder) {
return true;
}
return isHeaderOrFooter(viewHolder.getAdapterPosition());
}
public boolean isHeaderOrFooter(int i) {
return isHeader(i) || isFooter(i);
}
public boolean isHeader(int i) {
return i >= 0 && i < getHeaderCount();
}
public boolean isFooter(int i) {
return i >= getHeaderCount() + getContentItemCount();
}
public void addHeaderView(View view) {
this.mHeaderViews.put(getHeaderCount() + BASE_ITEM_TYPE_HEADER, view);
}
public void addHeaderViewAndNotify(View view) {
addHeaderView(view);
notifyItemInserted(getHeaderCount() - 1);
}
public void removeHeaderViewAndNotify(View view) {
int indexOfValue = this.mHeaderViews.indexOfValue(view);
if (indexOfValue == -1) {
return;
}
this.mHeaderViews.removeAt(indexOfValue);
notifyItemRemoved(indexOfValue);
}
public void addFooterView(View view) {
this.mFootViews.put(getFooterCount() + BASE_ITEM_TYPE_FOOTER, view);
}
public void addFooterViewAndNotify(View view) {
addFooterView(view);
notifyItemInserted(((getHeaderCount() + getContentItemCount()) + getFooterCount()) - 1);
}
public void removeFooterViewAndNotify(View view) {
int indexOfValue = this.mFootViews.indexOfValue(view);
if (indexOfValue == -1) {
return;
}
this.mFootViews.removeAt(indexOfValue);
notifyItemRemoved(getHeaderCount() + getContentItemCount() + indexOfValue);
}
public int getHeaderCount() {
return this.mHeaderViews.size();
}
public int getFooterCount() {
return this.mFootViews.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View view) {
super(view);
}
}
@Override
public final void setHasStableIds(boolean z) {
super.setHasStableIds(z);
}
@Override
public long getItemId(int i) {
if (isHeaderOrFooter(i)) {
return (-i) - 1;
}
return this.mAdapter.getItemId(i - getHeaderCount());
}
@Override
public void onViewRecycled(RecyclerView.ViewHolder viewHolder) {
if (isHeaderOrFooter(viewHolder)) {
return;
}
this.mAdapter.onViewRecycled(viewHolder);
}
@Override
public boolean onFailedToRecycleView(RecyclerView.ViewHolder viewHolder) {
if (isHeaderOrFooter(viewHolder)) {
return false;
}
return this.mAdapter.onFailedToRecycleView(viewHolder);
}
@Override
public void onViewDetachedFromWindow(RecyclerView.ViewHolder viewHolder) {
if (isHeaderOrFooter(viewHolder)) {
return;
}
this.mAdapter.onViewDetachedFromWindow(viewHolder);
}
@Override
public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver adapterDataObserver) {
super.registerAdapterDataObserver(adapterDataObserver);
}
@Override
public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver adapterDataObserver) {
super.unregisterAdapterDataObserver(adapterDataObserver);
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
this.mAdapter.onDetachedFromRecyclerView(recyclerView);
}
}