package com.team.zhuoke.ui.refreshview.recyclerview; import android.content.Context; import android.support.annotation.LayoutRes; 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 android.view.ViewParent; import android.widget.FrameLayout; import com.team.zhuoke.ui.refreshview.XRefreshView; import com.team.zhuoke.ui.refreshview.callback.IFooterCallBack; import com.team.zhuoke.ui.refreshview.utils.Utils; import com.team.zhuoke.utils.L; import java.util.Collections; import java.util.List; /** * An abstract adapter which can be extended for Recyclerview */ public abstract class BaseRecyclerAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> { protected View customLoadMoreView = null; protected View customHeaderView = null; private boolean isFooterEnable = true; @Override public VH onCreateViewHolder(ViewGroup parent, int viewType) { showFooter(customLoadMoreView, false); if (viewType == VIEW_TYPES.FOOTER) { Utils.removeViewFromParent(customLoadMoreView); VH viewHolder = getViewHolder(customLoadMoreView); return viewHolder; } else if (viewType == VIEW_TYPES.HEADER) { Utils.removeViewFromParent(customHeaderView); VH viewHolder = getViewHolder(customHeaderView); return viewHolder; } return onCreateViewHolder(parent, viewType, true); } private void showFooter(View footerview, boolean show) { if (isFooterEnable && footerview != null && footerview instanceof IFooterCallBack) { IFooterCallBack footerCallBack = (IFooterCallBack) footerview; if (show) { if (!footerCallBack.isShowing()) { footerCallBack.show(show); } } else { if (getAdapterItemCount() == 0 && footerCallBack.isShowing()) { footerCallBack.show(false); } else if (getAdapterItemCount() != 0 && !footerCallBack.isShowing()) { footerCallBack.show(true); } } } } private boolean removeFooter = false; public void addFooterView() { L.d("test addFooterView"); if (removeFooter) { notifyItemInserted(getItemCount()); removeFooter = false; showFooter(customLoadMoreView, true); } } public boolean isFooterShowing() { return !removeFooter; } public void removeFooterView() { L.d("test removeFooterView"); if (!removeFooter) { notifyItemRemoved(getItemCount() - 1); removeFooter = true; } } public abstract VH getViewHolder(View view); /** * 会调用此方法来判断是否显示空布局,返回true就会显示空布局<br/> * 如有特殊需要,可重写此方法 * * @return */ public boolean isEmpty() { return getAdapterItemCount() == 0; } /** * @param parent * @param viewType * @param isItem 如果是true,才需要做处理 ,但是这个值总是true */ public abstract VH onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem); /** * 替代onBindViewHolder方法,实现这个方法就行了 * * @param holder * @param position */ public abstract void onBindViewHolder(VH holder, int position, boolean isItem); @Override public final void onBindViewHolder(VH holder, int position) { int start = getStart(); if (!isHeader(position) && !isFooter(position)) { onBindViewHolder(holder, position - start, true); } } @Override public void onViewAttachedToWindow(VH holder) { super.onViewAttachedToWindow(holder); int position = holder.getLayoutPosition(); ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); if (lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams) { StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; p.setFullSpan(isFooter(position)); } } private final RecyclerViewDataObserver observer = new RecyclerViewDataObserver(); private XRefreshView mParent; @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); ViewParent parent = recyclerView.getParent(); if (parent != null && parent instanceof XRefreshView) { mParent = (XRefreshView) recyclerView.getParent(); if (mParent != null && !observer.hasAttached()) { observer.setData(this, mParent); observer.attach(); registerAdapterDataObserver(observer); } } } /** * Using a custom LoadMoreView * * @param footerView the inflated view */ public void setCustomLoadMoreView(View footerView) { if (footerView instanceof IFooterCallBack) { customLoadMoreView = footerView; Utils.removeViewFromParent(customLoadMoreView); if (mParent != null && mParent.getContentView() != null) { mParent.getContentView().initFooterCallBack(this, mParent); } showFooter(customLoadMoreView, false); notifyDataSetChanged(); } else { throw new RuntimeException("footerView must be implementes IFooterCallBack!"); } } public void setHeaderView(View headerView, RecyclerView recyclerView) { if (recyclerView == null) return; Utils.removeViewFromParent(headerView); customHeaderView = headerView; notifyDataSetChanged(); } public View setHeaderView(@LayoutRes int id, RecyclerView recyclerView) { if (recyclerView == null) return null; Context context = recyclerView.getContext(); String resourceTypeName = context.getResources().getResourceTypeName(id); if (!resourceTypeName.contains("layout")) { throw new RuntimeException(context.getResources().getResourceName(id) + " is a illegal layoutid , please check your layout id first !"); } FrameLayout headerview = new FrameLayout(recyclerView.getContext()); customHeaderView = LayoutInflater.from(context).inflate(id, headerview, false); notifyDataSetChanged(); return customHeaderView; } public boolean isFooter(int position) { int start = getStart(); return customLoadMoreView != null && position >= getAdapterItemCount() + start; } public boolean isHeader(int position) { return getStart() > 0 && position == 0; } public View getCustomLoadMoreView() { return customLoadMoreView; } @Override public final int getItemViewType(int position) { if (isHeader(position)) { return VIEW_TYPES.HEADER; } else if (isFooter(position)) { return VIEW_TYPES.FOOTER; } else { position = getStart() > 0 ? position - 1 : position; return getAdapterItemViewType(position); } } /** * 实现此方法来设置viewType * * @param position * @return viewType */ public int getAdapterItemViewType(int position) { return VIEW_TYPES.NORMAL; } public int getStart() { return customHeaderView == null ? 0 : 1; } /** * Returns the total number of items in the data set hold by the adapter. * * @return The total number of items in this adapter. */ @Override public final int getItemCount() { int count = getAdapterItemCount(); count += getStart(); if (customLoadMoreView != null && !removeFooter) { count++; } return count; } /** * Returns the number of items in the adapter bound to the parent * RecyclerView. * * @return The number of items in the bound adapter */ public abstract int getAdapterItemCount(); /** * Swap the item of list * * @param list data list * @param from position from * @param to position to */ public void swapPositions(List<?> list, int from, int to) { Collections.swap(list, from, to); } public void insideEnableFooter(boolean enable) { isFooterEnable = enable; } /** * Insert a item to the list of the adapter * * @param list data list * @param object object T * @param position position * @param <T> in T */ public <T> void insert(List<T> list, T object, int position) { list.add(position, object); notifyItemInserted(position + getStart()); } /** * Remove a item of the list of the adapter * * @param list data list * @param position position */ public void remove(List<?> list, int position) { if (list.size() > 0) { notifyItemRemoved(position + getStart()); } } /** * Clear the list of the adapter * * @param list data list */ public void clear(List<?> list) { int start = getStart(); int size = list.size(); list.clear(); notifyItemRangeRemoved(start, size); } protected class VIEW_TYPES { public static final int FOOTER = -1; public static final int HEADER = -3; public static final int NORMAL = -4; } }