package carbon.recycler; import android.view.ViewGroup; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import carbon.component.Component; public class RowArrayAdapter<Type> extends ArrayAdapter<RowViewHolder<Type>, Type> { private Map<Class, Integer> types = new HashMap<>(); private List<RowFactory> factories = new ArrayList<>(); public RowArrayAdapter(Class<? extends Type> type, RowFactory factory) { addFactory(type, factory); } public RowArrayAdapter(Type[] items, RowFactory factory) { super(items); addFactory((Class<? extends Type>) items[0].getClass(), factory); } public void addFactory(Class<? extends Type> type, RowFactory factory) { types.put(type, types.size()); factories.add(factory); } @Override public RowViewHolder<Type> onCreateViewHolder(ViewGroup viewGroup, int viewType) { Component component = factories.get(viewType).create(viewGroup); RowViewHolder viewHolder = new RowViewHolder(component.getView()); viewHolder.setComponent(component); return viewHolder; } @Override public void onBindViewHolder(final RowViewHolder<Type> holder, final int position) { Type data = getItem(position); Component component = holder.getComponent(); component.bind(data); component.getView().setOnClickListener(view -> fireOnItemClickedEvent(component.getView(), holder.getAdapterPosition())); } @Override public int getItemViewType(int position) { return types.get(getItem(position).getClass()); } }