package com.lean56.andplug.adapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import java.util.*; /** * Adapter for RecyclerView * * @param <T> * @author Charles */ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseRecyclerAdapter.ViewHolder> { protected Context mContext; private int mLayoutResId; protected List<T> mItems; private List<T> EMPTY = new ArrayList<>(); /** * Create adapter * * @param context * @param layoutResId */ public BaseRecyclerAdapter(final Context context, final int layoutResId) { this(context); this.mLayoutResId = layoutResId; } public BaseRecyclerAdapter(List<T> items) { if (items == null) items = EMPTY; this.mItems = items; } public BaseRecyclerAdapter(final Context context) { this.mContext = context; mItems = EMPTY; } public int getLayoutId(int viewType) { return this.mLayoutResId; } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(getLayoutId(viewType), viewGroup, false); return new ViewHolder(itemView); } @Override public abstract void onBindViewHolder(ViewHolder viewHolder, int position); @Override public long getItemId(final int position) { return mItems.get(position).hashCode(); } @Override public int getItemCount() { if (mItems == null) return 0; return mItems.size(); } public void addItem(T viewItem) { if (mItems != null) { mItems.add(viewItem); notifyDataSetChanged(); } } public void addAll(List<T> newData) { if (mItems != null) { int start = mItems.size(); mItems.addAll(newData); notifyItemRangeInserted(start, mItems.size() - 1); } } public void replaceAll(List<T> newData) { clearAll(); if (newData == null) { newData = new ArrayList<>(); } mItems = newData; notifyItemRangeInserted(0, mItems.size() - 1); } public void clearAll() { if (mItems == null) return; int size = this.mItems.size(); if (size > 0) { mItems = new ArrayList<>(); this.notifyItemRangeRemoved(0, size); } } protected List<T> getItems() { return mItems; } public void setItems(final List<T> items) { if (items != null) this.mItems = items; else this.mItems = EMPTY; notifyDataSetChanged(); } public T getItem(final int position) { return mItems.get(position); } /** * Provide a reference to the type of views that you are using (custom ViewHolder) */ public static class ViewHolder extends RecyclerView.ViewHolder { private final SparseArray<View> mViews = new SparseArray<>(); public ViewHolder(View v) { super(v); } public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = itemView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } public ViewHolder setTag(int viewId, Object tag) { getView(viewId).setTag(tag); return this; } public ViewHolder setText(int viewId, CharSequence text) { TextView view = getView(viewId); view.setText(text); return this; } public ViewHolder setGone(int viewId, boolean gone) { View view = getView(viewId); if (gone) { view.setVisibility(View.GONE); } else { view.setVisibility(View.VISIBLE); } return this; } public ViewHolder setImageResource(int viewId, int drawableId) { ImageView view = (ImageView) getView(viewId); view.setImageResource(drawableId); return this; } public ViewHolder setOnClickListener(int viewId, View.OnClickListener clickListener) { getView(viewId).setOnClickListener(clickListener); return this; } public ViewHolder setOnClickListener(int viewId, View.OnClickListener clickListener, Object tag) { View v = getView(viewId); v.setTag(tag); v.setOnClickListener(clickListener); return this; } public ViewHolder setOnItemClickListener(View.OnClickListener clickListener) { itemView.setOnClickListener(clickListener); return this; } } }