package com.jdroid.android.recycler; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.jdroid.java.collections.Lists; import com.jdroid.java.collections.Maps; import java.util.List; import java.util.Map; public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Map<Integer, RecyclerViewType> recyclerViewTypeMap = Maps.newHashMap(); private List<Object> items; public RecyclerViewAdapter(RecyclerViewType recyclerViewType) { this(Lists.newArrayList(recyclerViewType), Lists.newArrayList()); } public RecyclerViewAdapter(RecyclerViewType recyclerViewType, List<? extends Object> items) { this(Lists.newArrayList(recyclerViewType), items); } public RecyclerViewAdapter(List<RecyclerViewType> recyclerViewTypes) { this(recyclerViewTypes, Lists.newArrayList()); } public RecyclerViewAdapter(List<RecyclerViewType> recyclerViewTypes, List<? extends Object> items) { this.items = (List<Object>)items; int i = 1; for (RecyclerViewType each : recyclerViewTypes) { recyclerViewTypeMap.put(i, each); i++; } } public int addRecyclerViewType(RecyclerViewType recyclerViewType) { int viewType = recyclerViewTypeMap.size() + 1; recyclerViewTypeMap.put(viewType, recyclerViewType); return viewType; } @Override public int getItemViewType(int position) { Object item = items.get(position); Class eachClass = item.getClass(); while (eachClass != null) { for (Map.Entry<Integer, RecyclerViewType> entry : recyclerViewTypeMap.entrySet()) { if (entry.getValue().getItemClass().equals(eachClass)) { return entry.getKey(); } } eachClass = eachClass.getSuperclass(); } return -1; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); View view = recyclerViewTypeMap.get(viewType).inflateView(inflater, parent); return recyclerViewTypeMap.get(viewType).createViewHolderFromView(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { recyclerViewTypeMap.get(holder.getItemViewType()).fillHolderFromItem(items.get(position), holder); } @Override public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) { super.onViewDetachedFromWindow(holder); // The view could be reused while an animation is been happening. // In order to avoid that is recommendable to clear the animation when is detached. holder.itemView.clearAnimation(); } @Override public int getItemCount() { return items.size(); } public <T> void addItem(T item) { items.add(item); notifyItemInserted(items.size() - 1); } public <T> void addItems(List<T> newItems) { items.addAll(newItems); notifyItemRangeInserted(items.size() - newItems.size(), newItems.size()); } public <T> void removeItem(T item) { int pos = items.indexOf(item); items.remove(item); notifyItemRemoved(pos); } public void removeItemByPosition(int position) { items.remove(position); notifyItemRemoved(position); } public void clear() { int size = items.size(); items.clear(); notifyItemRangeRemoved(0, size); } public List<Object> getItems() { return items; } public Object getItem(Integer position) { return items.get(position); } }