package com.moral.andbrickslib.baseadapter.recyclerview; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import com.moral.andbrickslib.baseadapter.recyclerview.base.ItemViewDelegate; import com.moral.andbrickslib.baseadapter.recyclerview.base.ItemViewDelegateManager; import com.moral.andbrickslib.baseadapter.recyclerview.base.ViewHolder; import java.util.List; /** * Created by zhy on 16/4/9. */ public class MultiItemTypeAdapter extends RecyclerView.Adapter { protected Context mContext; protected List mDatas; protected ItemViewDelegateManager mItemViewDelegateManager; protected OnItemClickListener mOnItemClickListener; protected boolean isScrolling; public MultiItemTypeAdapter(RecyclerView v, List datas) { mContext = v.getContext(); mDatas = datas; mItemViewDelegateManager = new ItemViewDelegateManager(); v.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); isScrolling = !(newState == RecyclerView.SCROLL_STATE_IDLE); if (!isScrolling) { notifyDataSetChanged(); } } }); } @Override public int getItemViewType(int position) { if (!useItemViewDelegateManager()) return super.getItemViewType(position); return mItemViewDelegateManager.getItemViewType(mDatas.get(position), position); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(viewType); int layoutId = itemViewDelegate.getItemViewLayoutId(); ViewHolder holder = ViewHolder.createViewHolder(mContext, parent, layoutId); onViewHolderCreated(holder,holder.getConvertView()); setListener(parent, holder, viewType); return holder; } public void onViewHolderCreated(ViewHolder holder,View itemView){ } public void convert(ViewHolder holder, T t) { mItemViewDelegateManager.convert(holder, t, holder.getAdapterPosition()); } protected boolean isEnabled(int viewType) { return true; } protected void setListener(final ViewGroup parent, final ViewHolder viewHolder, int viewType) { if (!isEnabled(viewType)) return; viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { int position = viewHolder.getAdapterPosition(); mOnItemClickListener.onItemClick(v, viewHolder , position); } } }); viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (mOnItemClickListener != null) { int position = viewHolder.getAdapterPosition(); return mOnItemClickListener.onItemLongClick(v, viewHolder, position); } return false; } }); } @Override public void onBindViewHolder(ViewHolder holder, int position) { convert(holder, mDatas.get(position)); } @Override public int getItemCount() { int itemCount = mDatas.size(); return itemCount; } public List getDatas() { return mDatas; } public MultiItemTypeAdapter addItemViewDelegate(ItemViewDelegate itemViewDelegate) { mItemViewDelegateManager.addDelegate(itemViewDelegate); return this; } public MultiItemTypeAdapter addItemViewDelegate(int viewType, ItemViewDelegate itemViewDelegate) { mItemViewDelegateManager.addDelegate(viewType, itemViewDelegate); return this; } protected boolean useItemViewDelegateManager() { return mItemViewDelegateManager.getItemViewDelegateCount() > 0; } public interface OnItemClickListener { void onItemClick(View view, RecyclerView.ViewHolder holder, int position); boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position); } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.mOnItemClickListener = onItemClickListener; } }