package support.ui.adapters; import android.content.Context; import android.view.ViewGroup; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class BaseEasyViewHolderFactory { protected Context context; private Map<Class, Class<? extends EasyViewHolder>> boundViewHolders = new HashMap<>(); private List<Class> valueClassTypes = new ArrayList<>(); public BaseEasyViewHolderFactory(Context context) { this.context = context; } public EasyViewHolder create(int viewType, ViewGroup parent) { Class valueClass = valueClassTypes.get(viewType); try { Class<? extends EasyViewHolder> easyViewHolderClass = boundViewHolders.get(valueClass); Constructor<? extends EasyViewHolder> constructor = easyViewHolderClass.getDeclaredConstructor(Context.class, ViewGroup.class); return constructor.newInstance(context, parent); } catch (Throwable e) { throw new RuntimeException( "Unable to create ViewHolder for" + valueClass + ". " + e.getCause().getMessage(), e); } } void bind(Class valueClass, Class<? extends EasyViewHolder> viewHolder) { valueClassTypes.add(valueClass); boundViewHolders.put(valueClass, viewHolder); } public int itemViewType(Object object) { return valueClassTypes.indexOf(object.getClass()); } public List<Class> getValueClassTypes() { return valueClassTypes; } public Map<Class, Class<? extends EasyViewHolder>> getBoundViewHolders() { return boundViewHolders; } }