package uk.co.alt236.btlescan.ui.common.recyclerview; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; public class RecyclerViewBinderCore { public static final int INVALID_VIEWTYPE = -1; private static final String TAG = RecyclerViewBinderCore.class.getSimpleName(); private final List<Class<? extends BaseViewHolder<? extends RecyclerViewItem>>> mViewHolderClasses; private final List<BaseViewBinder<? extends RecyclerViewItem>> mViewBinders; private final List<Integer> mLayoutIds; public RecyclerViewBinderCore() { mViewBinders = new ArrayList<>(); mViewHolderClasses = new ArrayList<>(); mLayoutIds = new ArrayList<>(); } public void clear() { mViewBinders.clear(); mViewHolderClasses.clear(); mLayoutIds.clear(); } public <T extends RecyclerViewItem> void add( final BaseViewBinder<T> binder, final Class<? extends BaseViewHolder<T>> viewHolder, final int layoutId) { mViewBinders.add(binder); mViewHolderClasses.add(viewHolder); mLayoutIds.add(layoutId); } public BaseViewHolder<? extends RecyclerViewItem> create(ViewGroup parent, final int viewType) { if (viewType == INVALID_VIEWTYPE) { throw new IllegalArgumentException("Invalid viewType: " + viewType); } final Class<?> clazz = mViewHolderClasses.get(viewType); final int layoutId = mLayoutIds.get(viewType); final View itemView = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false); return (BaseViewHolder<? extends RecyclerViewItem>) instantiate(clazz, itemView); } public <T extends RecyclerViewItem> int getViewType(final T item) { int result = INVALID_VIEWTYPE; int count = 0; for (final BaseViewBinder<? extends RecyclerViewItem> binder : mViewBinders) { if (binder.canBind(item)) { result = count; break; } count++; } if (result == INVALID_VIEWTYPE) { Log.w(TAG, "Could not get viewType for " + item); } return result; } public BaseViewBinder<? extends RecyclerViewItem> getBinder(int viewType) { if (viewType == INVALID_VIEWTYPE) { throw new IllegalArgumentException("Invalid viewType: " + viewType); } return mViewBinders.get(viewType); } @SuppressWarnings("TryWithIdenticalCatches") private static Object instantiate( final Class<?> clazz, View parentView) { try { final Constructor<?> constructor = clazz.getDeclaredConstructors()[0]; return constructor.newInstance(parentView); } catch (InstantiationException e) { throw new IllegalStateException(e); } catch (IllegalAccessException e) { throw new IllegalStateException(e); } catch (InvocationTargetException e) { throw new IllegalStateException(e); } } }