package com.zhy.adapter.recyclerview.wrapper; import android.content.Context; 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 com.zhy.adapter.recyclerview.MultiItemTypeAdapter; import com.zhy.adapter.recyclerview.base.ItemViewDelegate; import com.zhy.adapter.recyclerview.base.ViewHolder; import java.util.ArrayList; import java.util.List; /** * Created by zhy on 16/6/23. */ public abstract class LoadMoreCommonAdapter<T> extends MultiItemTypeAdapter<T> { public static final int ITEM_TYPE_LOAD_MORE = Integer.MAX_VALUE - 2; private View mLoadMoreView; private int mLoadMoreLayoutId; public LoadMoreCommonAdapter(final Context context, int listItemLayout) { this(context, listItemLayout,new ArrayList<T>()); } public void refreshDatas(List<T> mList){ mDatas=mList; notifyDataSetChanged(); } public void addMoreDatas(List<T> mList){ mDatas.addAll(mList); // notifyDataSetChanged(); notifyItemRangeChanged(getItemCount()-1,mList.size()); } protected Context mContext; protected int mLayoutId; protected LayoutInflater mInflater; public LoadMoreCommonAdapter(final Context context, final int layoutId, List<T> datas) { super(context, datas); mContext = context; mInflater = LayoutInflater.from(context); mLayoutId = layoutId; mDatas = datas; addItemViewDelegate(new ItemViewDelegate<T>() { @Override public int getItemViewLayoutId() { return layoutId; } @Override public boolean isForViewType( T item, int position) { return true; } @Override public void convert(ViewHolder holder, T t, int position) { LoadMoreCommonAdapter.this.convert(holder, t, position); } }); } protected abstract void convert(ViewHolder holder, T t, int position); private boolean hasLoadMore() { return mLoadMoreView != null || mLoadMoreLayoutId != 0; } private boolean isShowLoadMore(int position) { return hasLoadMore() && (position >= getItemCount()); } @Override public int getItemViewType(int position) { if (isShowLoadMore(position)) { return ITEM_TYPE_LOAD_MORE; } return super.getItemViewType(position); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // Log.d("LoadMoreCommonAdapter","onCreateViewHolder"); if (viewType == ITEM_TYPE_LOAD_MORE) { ViewHolder holder; if (mLoadMoreView != null) { holder = ViewHolder.createViewHolder(parent.getContext(), mLoadMoreView); } else { holder = ViewHolder.createViewHolder(parent.getContext(), parent, mLoadMoreLayoutId); } return holder; } return super.onCreateViewHolder(parent, viewType); } @Override public void onBindViewHolder(ViewHolder holder, int position) { // Log.d("LoadMoreCommonAdapter","onBindViewHolder"); if (isShowLoadMore(position)) { if (mOnLoadMoreListener != null) { mOnLoadMoreListener.onLoadMoreRequested(); } return; } super.onBindViewHolder(holder, position); } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { // Log.d("LoadMoreCommonAdapter","onAttachedToRecyclerView"); super.onAttachedToRecyclerView(recyclerView); final 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 position) { if (isShowLoadMore(position)) { return gridLayoutManager.getSpanCount(); } if (spanSizeLookup != null) { return spanSizeLookup.getSpanSize(position); } return 1; } }); gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount()); } } @Override public void onViewAttachedToWindow(ViewHolder holder) { // Log.d("LoadMoreCommonAdapter","onViewAttachedToWindow"); if (isShowLoadMore(holder.getLayoutPosition())) { setFullSpan(holder); } } private void setFullSpan(RecyclerView.ViewHolder holder) { ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); if (lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams) { StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; p.setFullSpan(true); } } @Override public int getItemCount() { return super.getItemCount() + (hasLoadMore() ? 1 : 0); } public interface OnLoadMoreListener { void onLoadMoreRequested(); } private OnLoadMoreListener mOnLoadMoreListener; public LoadMoreCommonAdapter setOnLoadMoreListener(OnLoadMoreListener loadMoreListener) { if (loadMoreListener != null) { mOnLoadMoreListener = loadMoreListener; } return this; } public LoadMoreCommonAdapter setLoadMoreView(View loadMoreView) { mLoadMoreView = loadMoreView; return this; } public LoadMoreCommonAdapter setLoadMoreView(int layoutId) { mLoadMoreLayoutId = layoutId; return this; } }