package com.alorma.github.ui.adapter.base; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import com.alorma.github.utils.TimeFormatter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Locale; public abstract class RecyclerArrayAdapter<ItemType, ViewHolder extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<ViewHolder> { public List<ItemType> items; private LayoutInflater inflater; private TimeFormatter timeFormatter; private RecyclerAdapterContentListener recyclerAdapterContentListener; private ItemCallback<ItemType> callback; private boolean returnResult; public RecyclerArrayAdapter(LayoutInflater inflater) { this.inflater = inflater; items = new ArrayList<>(); } @Override public int getItemCount() { return items.size(); } public ItemType getItem(int position) { return items.get(position); } public void add(ItemType itemType) { items.add(itemType); notifyDataSetChanged(); } public void addAll(Collection<? extends ItemType> items) { this.items.addAll(items); notifyDataSetChanged(); } public void clear() { items.clear(); notifyDataSetChanged(); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { onBindViewHolder(holder, getItem(position)); if (recyclerAdapterContentListener != null && position + lazyLoadCount() >= getItemCount()) { recyclerAdapterContentListener.loadMoreItems(); } } @Override public int getItemViewType(int position) { return getItemViewType(items.get(position)); } protected int getItemViewType(ItemType itemType) { return 0; } protected abstract void onBindViewHolder(ViewHolder holder, ItemType type); protected int lazyLoadCount() { return 1; } public LayoutInflater getInflater() { return inflater; } public void setInflater(LayoutInflater inflater) { this.inflater = inflater; } public void remove(ItemType itemType) { items.remove(itemType); notifyDataSetChanged(); } public List<ItemType> getItems() { return items; } public void setRecyclerAdapterContentListener(RecyclerAdapterContentListener recyclerAdapterContentListener) { this.recyclerAdapterContentListener = recyclerAdapterContentListener; } public TimeFormatter getTimeFormatter() { if (timeFormatter == null) { timeFormatter = new TimeFormatter() { @Override public String relative(long milis) { SimpleDateFormat sdf = new SimpleDateFormat("YYYY/MM/DD", Locale.getDefault()); return sdf.format(new Date(milis)); } @Override public String absolute(long milis) { SimpleDateFormat sdf = new SimpleDateFormat("YYYY/MM/DD", Locale.getDefault()); return sdf.format(new Date(milis)); } }; } return timeFormatter; } public void setTimeFormatter(TimeFormatter timeFormatter) { this.timeFormatter = timeFormatter; } public ItemCallback<ItemType> getCallback() { if (callback == null) { callback = item -> { }; } return callback; } public void setCallback(ItemCallback<ItemType> callback) { this.callback = callback; } public void setReturn(boolean aReturn) { this.returnResult = aReturn; } public boolean isReturnResult() { return returnResult; } public void setReturnResult(boolean returnResult) { this.returnResult = returnResult; } public interface RecyclerAdapterContentListener { void loadMoreItems(); } public interface ItemCallback<ItemType> { void onItemSelected(ItemType item); } }