package com.example.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.R;
import com.example.entity.ProductEntity;
import java.util.List;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
{
private static final int VIEW_TYPE_HEADER = 0;
private static final int VIEW_TYPE_PRODUCT = 1;
private static final int VIEW_TYPE_FOOTER = 2;
private List<String> mHeaderList;
private List<ProductEntity> mProductList;
private List<Object> mFooterList;
private ProductViewHolder.OnItemClickListener mListener;
public RecyclerAdapter(List<String> headerList, List<ProductEntity> productList, List<Object> footerList, ProductViewHolder.OnItemClickListener listener)
{
mHeaderList = headerList;
mProductList = productList;
mFooterList = footerList;
mListener = listener;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
// inflate view and create view holder
if(viewType == VIEW_TYPE_HEADER)
{
View view = inflater.inflate(R.layout.fragment_recycler_header, parent, false);
return new HeaderViewHolder(view);
}
else if(viewType == VIEW_TYPE_PRODUCT)
{
View view = inflater.inflate(R.layout.fragment_recycler_item, parent, false);
return new ProductViewHolder(view, mListener);
}
else if(viewType == VIEW_TYPE_FOOTER)
{
View view = inflater.inflate(R.layout.fragment_recycler_footer, parent, false);
return new FooterViewHolder(view);
}
else
{
throw new RuntimeException("There is no view type that matches the type " + viewType);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position)
{
if(viewHolder instanceof HeaderViewHolder)
{
// entity
String string = mHeaderList.get(getHeaderPosition(position));
// bind data
if(string != null)
{
((HeaderViewHolder) viewHolder).bindData(string);
}
}
else if(viewHolder instanceof ProductViewHolder)
{
// entity
ProductEntity product = mProductList.get(getProductPosition(position));
// bind data
if(product != null)
{
((ProductViewHolder) viewHolder).bindData(product);
}
}
else if(viewHolder instanceof FooterViewHolder)
{
// entity
Object object = mFooterList.get(getFooterPosition(position));
// bind data
if(object != null)
{
((FooterViewHolder) viewHolder).bindData(object);
}
}
}
@Override
public int getItemCount()
{
int size = 0;
if(mHeaderList != null) size += mHeaderList.size();
if(mProductList != null) size += mProductList.size();
if(mFooterList != null) size += mFooterList.size();
return size;
}
@Override
public int getItemViewType(int position)
{
int headers = mHeaderList.size();
int products = mProductList.size();
int footers = mFooterList.size();
if(position < headers) return VIEW_TYPE_HEADER;
else if(position < headers + products) return VIEW_TYPE_PRODUCT;
else if(position < headers + products + footers) return VIEW_TYPE_FOOTER;
else return -1;
}
public int getHeaderCount()
{
if(mHeaderList != null) return mHeaderList.size();
return 0;
}
public int getProductCount()
{
if(mProductList != null) return mProductList.size();
return 0;
}
public int getFooterCount()
{
if(mFooterList != null) return mFooterList.size();
return 0;
}
public int getHeaderPosition(int recyclerPosition)
{
return recyclerPosition;
}
public int getProductPosition(int recyclerPosition)
{
return recyclerPosition - getHeaderCount();
}
public int getFooterPosition(int recyclerPosition)
{
return recyclerPosition - getHeaderCount() - getProductCount();
}
public int getRecyclerPositionByHeader(int headerPosition)
{
return headerPosition;
}
public int getRecyclerPositionByProduct(int productPosition)
{
return productPosition + getHeaderCount();
}
public int getRecyclerPositionByFooter(int footerPosition)
{
return footerPosition + getProductCount() + getHeaderCount();
}
public void refill(List<String> headerList, List<ProductEntity> productList, List<Object> footerList, ProductViewHolder.OnItemClickListener listener)
{
mHeaderList = headerList;
mProductList = productList;
mFooterList = footerList;
mListener = listener;
notifyDataSetChanged();
}
public void stop()
{
// TODO: stop image loader
}
public static final class HeaderViewHolder extends RecyclerView.ViewHolder
{
private TextView mNameTextView;
public HeaderViewHolder(View itemView)
{
super(itemView);
// find views
mNameTextView = (TextView) itemView.findViewById(R.id.fragment_recycler_header_name);
}
public void bindData(String string)
{
mNameTextView.setText(string);
}
}
public static final class ProductViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener
{
private TextView mNameTextView;
private OnItemClickListener mListener;
public interface OnItemClickListener
{
void onItemClick(View view, int position, long id, int viewType);
void onItemLongClick(View view, int position, long id, int viewType);
}
public ProductViewHolder(View itemView, OnItemClickListener listener)
{
super(itemView);
mListener = listener;
// set listener
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
// find views
mNameTextView = (TextView) itemView.findViewById(R.id.fragment_recycler_item_name);
}
@Override
public void onClick(View view)
{
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION)
{
mListener.onItemClick(view, position, getItemId(), getItemViewType());
}
}
@Override
public boolean onLongClick(View view)
{
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION)
{
mListener.onItemLongClick(view, position, getItemId(), getItemViewType());
}
return true;
}
public void bindData(ProductEntity product)
{
mNameTextView.setText(product.getName());
}
}
public static final class FooterViewHolder extends RecyclerView.ViewHolder
{
public FooterViewHolder(View itemView)
{
super(itemView);
}
public void bindData(Object object)
{
// do nothing
}
}
}