package bf.io.openshop.ux.adapters; import android.content.Context; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import bf.io.openshop.R; import bf.io.openshop.SettingsMy; import bf.io.openshop.entities.User; import bf.io.openshop.entities.drawerMenu.DrawerItemCategory; import bf.io.openshop.entities.drawerMenu.DrawerItemPage; import bf.io.openshop.interfaces.DrawerRecyclerInterface; import bf.io.openshop.listeners.OnSingleClickListener; /** * Adapter handling list of drawer items. */ public class DrawerRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final int TYPE_HEADER = 0; private static final int TYPE_ITEM_CATEGORY = 1; private static final int TYPE_ITEM_PAGE = 2; private final DrawerRecyclerInterface drawerRecyclerInterface; private LayoutInflater layoutInflater; private Context context; private List<DrawerItemCategory> drawerItemCategoryList = new ArrayList<>(); private List<DrawerItemPage> drawerItemPageList = new ArrayList<>(); /** * Creates an adapter that handles a list of drawer items. * * @param context activity context. * @param drawerRecyclerInterface listener indicating events that occurred. */ public DrawerRecyclerAdapter(Context context, DrawerRecyclerInterface drawerRecyclerInterface) { this.context = context; this.drawerRecyclerInterface = drawerRecyclerInterface; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (layoutInflater == null) layoutInflater = LayoutInflater.from(parent.getContext()); if (viewType == TYPE_ITEM_CATEGORY) { View view = layoutInflater.inflate(R.layout.list_item_drawer_category, parent, false); return new ViewHolderItemCategory(view, drawerRecyclerInterface); } else if (viewType == TYPE_ITEM_PAGE) { View view = layoutInflater.inflate(R.layout.list_item_drawer_page, parent, false); return new ViewHolderItemPage(view, drawerRecyclerInterface); } else { View view = layoutInflater.inflate(R.layout.list_item_drawer_header, parent, false); return new ViewHolderHeader(view, drawerRecyclerInterface); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ViewHolderItemCategory) { ViewHolderItemCategory viewHolderItemCategory = (ViewHolderItemCategory) holder; DrawerItemCategory drawerItemCategory = getDrawerItem(position); viewHolderItemCategory.bindContent(drawerItemCategory); viewHolderItemCategory.itemText.setText(drawerItemCategory.getName()); if (position == 1) { viewHolderItemCategory.itemText.setTextColor(ContextCompat.getColor(context, R.color.colorAccent)); viewHolderItemCategory.itemText.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(context, R.drawable.star), null, null, null); viewHolderItemCategory.divider.setVisibility(View.VISIBLE); } else { viewHolderItemCategory.itemText.setTextColor(ContextCompat.getColor(context, R.color.textPrimary)); viewHolderItemCategory.itemText.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); viewHolderItemCategory.divider.setVisibility(View.GONE); } if (drawerItemCategory.getChildren() == null || drawerItemCategory.getChildren().isEmpty()) { viewHolderItemCategory.subMenuIndicator.setVisibility(View.INVISIBLE); } else { viewHolderItemCategory.subMenuIndicator.setVisibility(View.VISIBLE); } } else if (holder instanceof ViewHolderItemPage) { ViewHolderItemPage viewHolderItemPage = (ViewHolderItemPage) holder; DrawerItemPage drawerItemPage = getPageItem(position); viewHolderItemPage.bindContent(drawerItemPage); viewHolderItemPage.itemText.setText(drawerItemPage.getName()); } else if (holder instanceof ViewHolderHeader) { ViewHolderHeader viewHolderHeader = (ViewHolderHeader) holder; User user = SettingsMy.getActiveUser(); if (user != null) { viewHolderHeader.userName.setText(user.getEmail()); } else { viewHolderHeader.userName.setText(context.getString(R.string.Unknown_user)); } } } @Override public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) { super.onViewDetachedFromWindow(holder); // Clear the animation when the view is detached. Prevent bugs during fast scroll. if (holder instanceof ViewHolderItemCategory) { ((ViewHolderItemCategory) holder).layout.clearAnimation(); } else if (holder instanceof ViewHolderItemPage) { ((ViewHolderItemPage) holder).layout.clearAnimation(); } } @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); // Apply the animation when the view is attached if (holder instanceof ViewHolderItemCategory) { setAnimation(((ViewHolderItemCategory) holder).layout); } else if (holder instanceof ViewHolderItemPage) { setAnimation(((ViewHolderItemPage) holder).layout); } } /** * Here is the key method to apply the animation */ private void setAnimation(View viewToAnimate) { Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left); viewToAnimate.startAnimation(animation); } // This method returns the number of items present in the list @Override public int getItemCount() { return drawerItemCategoryList.size() + drawerItemPageList.size() + 1; // the number of items in the list will be +1 the titles including the header view. } @Override public int getItemViewType(int position) { if (position == 0) return TYPE_HEADER; else if (position <= drawerItemCategoryList.size()) return TYPE_ITEM_CATEGORY; else return TYPE_ITEM_PAGE; } private DrawerItemCategory getDrawerItem(int position) { return drawerItemCategoryList.get(position - 1); } private DrawerItemPage getPageItem(int position) { return drawerItemPageList.get(position - drawerItemCategoryList.size() - 1); } public void addDrawerItemList(List<DrawerItemCategory> drawerItemCategories) { if (drawerItemCategories != null) drawerItemCategoryList.addAll(drawerItemCategories); } public void addPageItemList(List<DrawerItemPage> drawerItemPages) { if (drawerItemPages != null) drawerItemPageList.addAll(drawerItemPages); } public void addDrawerItem(DrawerItemCategory drawerItemCategory) { drawerItemCategoryList.add(drawerItemCategory); } // Provide a reference to the views for each data item public static class ViewHolderItemPage extends RecyclerView.ViewHolder { public TextView itemText; public View layout; private DrawerItemPage drawerItemPage; public ViewHolderItemPage(View itemView, final DrawerRecyclerInterface drawerRecyclerInterface) { super(itemView); itemText = (TextView) itemView.findViewById(R.id.drawer_list_item_text); layout = itemView.findViewById(R.id.drawer_list_item_layout); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { drawerRecyclerInterface.onPageSelected(v, drawerItemPage); } }); } public void bindContent(DrawerItemPage drawerItemPage) { this.drawerItemPage = drawerItemPage; } } // Provide a reference to the views for each data item public static class ViewHolderItemCategory extends RecyclerView.ViewHolder { public TextView itemText; public ImageView subMenuIndicator; public LinearLayout layout; private DrawerItemCategory drawerItemCategory; private View divider; public ViewHolderItemCategory(View itemView, final DrawerRecyclerInterface drawerRecyclerInterface) { super(itemView); itemText = (TextView) itemView.findViewById(R.id.drawer_list_item_text); subMenuIndicator = (ImageView) itemView.findViewById(R.id.drawer_list_item_indicator); layout = (LinearLayout) itemView.findViewById(R.id.drawer_list_item_layout); divider = itemView.findViewById(R.id.drawer_list_item_divider); itemView.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { drawerRecyclerInterface.onCategorySelected(v, drawerItemCategory); } }); } public void bindContent(DrawerItemCategory drawerItemCategory) { this.drawerItemCategory = drawerItemCategory; } } public static class ViewHolderHeader extends RecyclerView.ViewHolder { public TextView userName; public ViewHolderHeader(View headerView, final DrawerRecyclerInterface drawerRecyclerInterface) { super(headerView); userName = (TextView) headerView.findViewById(R.id.navigation_drawer_list_header_text); headerView.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { drawerRecyclerInterface.onHeaderSelected(); } }); } } }