package com.anthony.rvhelper.wrapper; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import com.anthony.rvhelper.base.ViewHolder; import com.anthony.rvhelper.utils.WrapperUtils; /** * Created by zhy on 16/6/23. */ public class EmptyWrapper<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public static final int ITEM_TYPE_EMPTY = Integer.MAX_VALUE - 1; private RecyclerView.Adapter mInnerAdapter; private View mEmptyView; private int mEmptyLayoutId; public EmptyWrapper(RecyclerView.Adapter adapter) { mInnerAdapter = adapter; } private boolean isEmpty() { return (mEmptyView != null || mEmptyLayoutId != 0) && mInnerAdapter.getItemCount() == 0; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (isEmpty()) { ViewHolder holder; if (mEmptyView != null) { holder = ViewHolder.createViewHolder(parent.getContext(), mEmptyView); } else { holder = ViewHolder.createViewHolder(parent.getContext(), parent, mEmptyLayoutId); } return holder; } return mInnerAdapter.onCreateViewHolder(parent, viewType); } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() { @Override public int getSpanSize(GridLayoutManager gridLayoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) { if (isEmpty()) { return gridLayoutManager.getSpanCount(); } if (oldLookup != null) { return oldLookup.getSpanSize(position); } return 1; } }); } @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { mInnerAdapter.onViewAttachedToWindow(holder); if (isEmpty()) { WrapperUtils.setFullSpan(holder); } } @Override public int getItemViewType(int position) { if (isEmpty()) { return ITEM_TYPE_EMPTY; } return mInnerAdapter.getItemViewType(position); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (isEmpty()) { return; } mInnerAdapter.onBindViewHolder(holder, position); } @Override public int getItemCount() { if (isEmpty()) return 1; return mInnerAdapter.getItemCount(); } public void setEmptyView(View emptyView) { mEmptyView = emptyView; } public void setEmptyView(int layoutId) { mEmptyLayoutId = layoutId; } }