package com.frozendevs.periodictable.model.adapter; import android.content.Context; import android.graphics.Typeface; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.frozendevs.periodictable.R; import com.frozendevs.periodictable.model.Isotope; import com.frozendevs.periodictable.view.ExpandableIndicatorView; import com.h6ah4i.android.widget.advrecyclerview.expandable.RecyclerViewExpandableItemManager; import com.h6ah4i.android.widget.advrecyclerview.utils.AbstractExpandableItemAdapter; import com.h6ah4i.android.widget.advrecyclerview.utils.AbstractExpandableItemViewHolder; public class IsotopesAdapter extends AbstractExpandableItemAdapter<IsotopesAdapter.GroupViewHolder, IsotopesAdapter.ChildViewHolder> { private Typeface mTypeface; private IsotopeProperties[] mProperties = new IsotopeProperties[0]; private class Property { String mName = "", mValue = "", mValueRaw = ""; Property(Context context, String value) { if (value != null) { mValueRaw = value; if (!value.equals("")) mValue = value; else mValue = context.getString(R.string.property_value_unknown); } } Property(Context context, int name, String value) { this(context, value); mName = context.getString(name); } Property(Context context, int name, String value, int noneValue) { this(context, name, value); if (value != null && value.equals("")) { mValue = context.getString(noneValue); } } Property(Context context, int name, String value, int noneValue, int specialValue) { this(context, name, value, noneValue); if (value != null && value.equals("-")) { mValue = context.getString(specialValue); } } String getName() { return mName; } String getValue() { return mValue; } String getValueRaw() { return mValueRaw; } } private class IsotopeProperties { Property symbol, halfLife, spin, abundance, decayModes; public IsotopeProperties(Context context, Isotope isotope) { symbol = new Property(context, isotope.getSymbol()); halfLife = new Property(context, R.string.property_half_life, isotope.getHalfLife(), R.string.property_value_unknown, R.string.property_value_stable); spin = new Property(context, R.string.property_spin, isotope.getSpin(), R.string.property_value_unknown); abundance = new Property(context, R.string.property_abundance, isotope.getAbundance(), R.string.property_value_none, R.string.property_value_trace); decayModes = new Property(context, R.string.property_decay_modes, isotope.getHalfLife().equals("-") ? context.getString(R.string.property_value_none) : isotope.getDecayModes()); } public Property getSymbol() { return symbol; } public Property getHalfLife() { return halfLife; } public Property getSpin() { return spin; } public Property getAbundance() { return abundance; } public Property getDecayModes() { return decayModes; } } public class GroupViewHolder extends AbstractExpandableItemViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener { private TextView mSymbol, mHalfLife, mAbundance; private ExpandableIndicatorView mIndicator; public GroupViewHolder(View view) { super(view); mIndicator = (ExpandableIndicatorView) view.findViewById(R.id.group_indicator); mSymbol = (TextView) view.findViewById(R.id.property_symbol); mHalfLife = (TextView) view.findViewById(R.id.property_half_life); mAbundance = (TextView) view.findViewById(R.id.property_abundance); view.setOnClickListener(this); view.setOnCreateContextMenuListener(this); } public void setIndicatorState(boolean expanded) { mIndicator.setStateExpanded(expanded); } public void setSymbol(String symbol) { mSymbol.setText(symbol); } public void setHalfLife(String halfLife) { mHalfLife.setText(halfLife); } public void setAbundance(String abundance) { mAbundance.setText(abundance); } public void setTypeface(Typeface typeface) { mSymbol.setTypeface(typeface); mHalfLife.setTypeface(typeface); mAbundance.setTypeface(typeface); } @Override public void onClick(View view) { } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { } } public class ChildViewHolder extends AbstractExpandableItemViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener { private TextView mName, mValue; public ChildViewHolder(View view) { super(view); mName = (TextView) view.findViewById(R.id.property_name); mValue = (TextView) view.findViewById(R.id.property_value); view.setOnClickListener(this); view.setOnCreateContextMenuListener(this); } public void setName(String name) { mName.setText(name); } public void setValue(String value) { mValue.setText(value); } public void setTypeface(Typeface typeface) { mName.setTypeface(typeface); mValue.setTypeface(typeface); } @Override public void onClick(View view) { } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { } } public IsotopesAdapter(Context context, Isotope[] isotopes) { mTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/NotoSans-Regular.ttf"); if (isotopes != null) { mProperties = new IsotopeProperties[isotopes.length]; for (int i = 0; i < isotopes.length; i++) { mProperties[i] = new IsotopeProperties(context, isotopes[i]); } } setHasStableIds(true); } @Override public int getGroupCount() { return mProperties.length; } @Override public int getChildCount(int groupPosition) { return 4; } @Override public long getGroupId(int groupPosition) { return mProperties[groupPosition].hashCode(); } @Override public long getChildId(int groupPosition, int childPosition) { return getChild(groupPosition, childPosition).hashCode(); } @Override public int getGroupItemViewType(int groupPosition) { return 0; } @Override public int getChildItemViewType(int groupPosition, int childPosition) { return 0; } @Override public GroupViewHolder onCreateGroupViewHolder(ViewGroup viewGroup, int viewType) { GroupViewHolder viewHolder = new GroupViewHolder(LayoutInflater.from(viewGroup. getContext()).inflate(R.layout.isotope_list_item, viewGroup, false)); viewHolder.setTypeface(mTypeface); return viewHolder; } @Override public ChildViewHolder onCreateChildViewHolder(ViewGroup viewGroup, int viewType) { ChildViewHolder viewHolder = new ChildViewHolder(LayoutInflater.from(viewGroup. getContext()).inflate(R.layout.properties_list_item, viewGroup, false)); viewHolder.setTypeface(mTypeface); return viewHolder; } @Override public void onBindGroupViewHolder(GroupViewHolder groupViewHolder, int groupPosition, int viewType) { IsotopeProperties properties = mProperties[groupPosition]; groupViewHolder.setSymbol(properties.getSymbol().getValue()); groupViewHolder.setHalfLife(""); groupViewHolder.setAbundance(""); if (!properties.getHalfLife().getValueRaw().equals("")) { groupViewHolder.setHalfLife(properties.getHalfLife().getValue()); if (!properties.getAbundance().getValueRaw().equals("")) { groupViewHolder.setAbundance(properties.getAbundance().getValue()); } } final int expandState = groupViewHolder.getExpandStateFlags(); if ((expandState & RecyclerViewExpandableItemManager.STATE_FLAG_IS_UPDATED) != 0) { groupViewHolder.setIndicatorState((expandState & RecyclerViewExpandableItemManager. STATE_FLAG_IS_EXPANDED) != 0); } } @Override public void onBindChildViewHolder(ChildViewHolder childViewHolder, int groupPosition, int childPosition, int viewType) { Property property = getChild(groupPosition, childPosition); childViewHolder.setName(property.getName()); childViewHolder.setValue(property.getValue()); } @Override public boolean onCheckCanExpandOrCollapseGroup(GroupViewHolder groupViewHolder, int groupPosition, int x, int y, boolean expand) { return true; } private Property getChild(int groupPosition, int childPosition) { IsotopeProperties properties = mProperties[groupPosition]; switch (childPosition) { case 0: return properties.getHalfLife(); case 1: return properties.getDecayModes(); case 2: return properties.getSpin(); default: return properties.getAbundance(); } } }