package com.byoutline.kickmaterial.adapters; import android.content.Context; import android.graphics.Color; import android.support.v4.content.ContextCompat; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; import com.byoutline.kickmaterial.R; import com.byoutline.kickmaterial.model.Reward; import com.byoutline.kickmaterial.model.RewardItem; import com.byoutline.secretsauce.utils.ViewUtils; import org.parceler.Parcel; import java.util.ArrayList; import java.util.List; /** * @author Pawel Karczewski <pawel.karczewski at byoutline.com> on 2015-01-03 */ public class RewardAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private final List<RewardItem> dataset = new ArrayList<>(); private final int semiGreenColor; private Context context; private RewardClickListener rewardClickListener; // Adapter's Constructor public RewardAdapter(Context context, RewardClickListener rewardClickListener) { this.context = context; this.rewardClickListener = rewardClickListener; semiGreenColor = ContextCompat.getColor(context, R.color.green_light); } public RewardItem getItem(int position) { if (dataset != null) { return dataset.get(position); } else { return null; } } // Create new views. This is invoked by the layout manager. @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // Create a new view by inflating the row item xml. View v = null; RecyclerView.ViewHolder holder = null; switch (viewType) { case RewardItem.ITEM: v = LayoutInflater.from(parent.getContext()).inflate(R.layout.reward_list_item, parent, false); holder = new RewardViewHolder(v, rewardClickListener); break; case RewardItem.HEADER: v = LayoutInflater.from(parent.getContext()).inflate(R.layout.reward_header_item, parent, false); holder = new RewardHeaderViewHolder(v); break; } // Set the view to the ViewHolder return holder; } // Replace the contents of a view. This is invoked by the layout manager. @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { int type = getItemViewType(position); switch (type) { case RewardItem.ITEM: RewardViewHolder rewardHolder = (RewardViewHolder) holder; Reward reward = (Reward) getItem(position); if (position == 0) { rewardHolder.rewardItemContainerCv.setCardBackgroundColor(semiGreenColor); } else { rewardHolder.rewardItemContainerCv.setCardBackgroundColor(Color.WHITE); } if (reward != null) { rewardHolder.rewardItemAmountTv.setText(context.getString(R.string.reward_value, reward.minimum)); // ViewUtils.setTextOrClear(rewardHolder.rewardItemAmountTv, Double.toString(reward.minimum)); ViewUtils.setTextOrClear(rewardHolder.rewardItemDescTv, reward.description); ViewUtils.setTextOrClear(rewardHolder.rewardItemTitleTv, reward.reward); } break; case RewardItem.HEADER: RewardHeaderViewHolder headerHolder = (RewardHeaderViewHolder) holder; RewardHeader header = (RewardHeader) getItem(position); headerHolder.rewardHeaderTv.setText(context.getString(R.string.reward_more_than, header.minimum)); break; } } @Override public int getItemViewType(int position) { return getItem(position).getItemType(); } // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { return dataset.size(); } public void setItems(List<Reward> items) { synchronized (dataset) { double currentTreshold = 100.0; double step = 10; dataset.clear(); ArrayList<RewardItem> rewardItems = new ArrayList<>(); for (Reward reward : items) { if (reward.minimum >= currentTreshold) { rewardItems.add(new RewardHeader((int) currentTreshold)); currentTreshold *= step; } rewardItems.add(reward); } dataset.addAll(rewardItems); notifyDataSetChanged(); rewardItems.clear(); } } /** * This class contains all butterknife-injected Views & Layouts from layout file 'reward_list_item.xml' * for easy to all layout elements. * * @author ButterKnifeZelezny, plugin for Android Studio by Avast Developers (http://github.com/avast) */ // Create the ViewHolder class to keep references to your views public static class RewardViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public RewardClickListener listener; @BindView(R.id.reward_item_amount_tv) TextView rewardItemAmountTv; @BindView(R.id.reward_item_currency_tv) TextView rewardItemCurrencyTv; @BindView(R.id.reward_item_type_tv) TextView rewardItemTitleTv; @BindView(R.id.reward_item_desc_tv) TextView rewardItemDescTv; @BindView(R.id.reward_container_cv) CardView rewardItemContainerCv; /** * Constructor * * @param v The container view which holds the elements from the row item xml */ public RewardViewHolder(View v, RewardClickListener listener) { super(v); ButterKnife.bind(this, v); this.listener = listener; itemView.setOnClickListener(this); } @Override public void onClick(View v) { if (listener != null) { listener.rewardClicked(getPosition()); } } } @Parcel(Parcel.Serialization.FIELD) public class RewardHeader implements RewardItem { public int minimum; public RewardHeader(int minimum) { this.minimum = minimum; } @Override public int getItemType() { return HEADER; } } class RewardHeaderViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.reward_header_tv) TextView rewardHeaderTv; RewardHeaderViewHolder(View view) { super(view); ButterKnife.bind(this, view); } } }