package cn.mutils.app.ui.adapter; import android.content.Context; import android.database.DataSetObserver; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import java.lang.reflect.Constructor; import java.util.List; import cn.mutils.core.reflect.ReflectUtil; /** * RecyclerAdapter */ public class RecyclerAdapter<DATA_ITEM> extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder<DATA_ITEM>> implements IItemAdapter<DATA_ITEM> { protected ViewGroup mContainer; protected List<DATA_ITEM> mDataProvider; protected Constructor<? extends IItemView<DATA_ITEM>> mItemViewConstructor; public void setItemViewClass(Class<? extends IItemView<DATA_ITEM>> itemViewClass) { mItemViewConstructor = ReflectUtil.getConstructor(itemViewClass, Context.class); } public Context getContext() { return mContainer == null ? null : mContainer.getContext(); } public ViewGroup getContainer() { return this.mContainer; } protected void onContainerChanged() { } public List<DATA_ITEM> getDataProvider() { return mDataProvider; } public void setDataProvider(List<DATA_ITEM> dataProvider) { this.mDataProvider = dataProvider; this.notifyDataSetChanged(); } @Override public DATA_ITEM getItem(int position) { return mDataProvider == null ? null : mDataProvider.get(position); } @Override public int getItemCount() { return mDataProvider == null ? 0 : mDataProvider.size(); } @Override public int getCount() { return mDataProvider == null ? 0 : mDataProvider.size(); } @Override public boolean isEmpty() { return getCount() == 0; } @Override public boolean isEnabled(int position) { return true; } @Override public boolean areAllItemsEnabled() { return true; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { return getView(position, convertView, parent); } @Override public View getView(int position, View convertView, ViewGroup parent) { return null; } @Override public void registerDataSetObserver(DataSetObserver dataSetObserver) { } @Override public void unregisterDataSetObserver(DataSetObserver dataSetObserver) { } @Override public int getViewTypeCount() { return 1; } public IItemView<DATA_ITEM> getItemView(int itemViewType) { return mItemViewConstructor == null ? null : ReflectUtil.newInstance(mItemViewConstructor, getContext()); } @Override public RecyclerViewHolder<DATA_ITEM> onCreateViewHolder(ViewGroup parent, int viewType) { if (this.mContainer == null) { this.mContainer = parent; this.onContainerChanged(); } IItemView<DATA_ITEM> itemView = getItemView(viewType); itemView.setAdapter(this); itemView.onCreate(); return new RecyclerViewHolder<DATA_ITEM>(itemView.toView()); } @Override public void onBindViewHolder(RecyclerViewHolder<DATA_ITEM> holder, int position) { IItemView<DATA_ITEM> itemView = holder.getItemView(); if (itemView == null) { return; } itemView.setPosition(position); itemView.setDataProvider(this.getItem(position)); itemView.onResume(); } public static class RecyclerViewHolder<DATA_ITEM> extends RecyclerView.ViewHolder { public RecyclerViewHolder(View itemView) { super(itemView); } public IItemView<DATA_ITEM> getItemView() { return (itemView instanceof IItemView) ? ((IItemView<DATA_ITEM>) itemView) : null; } } }