package com.idunnolol.sotm.widget; import android.content.Context; import android.content.res.Resources; import android.support.v4.view.ViewCompat; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.TextView; import com.danlew.utils.FontCache; import com.danlew.utils.Ui; import com.idunnolol.sotm.R; import com.idunnolol.sotm.data.Card; import com.idunnolol.sotm.data.CardSet; import com.idunnolol.sotm.data.Db; import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class CardConfigAdapter extends BaseAdapter implements StickyListHeadersAdapter { private Context mContext; private List<CardSet> mHeaders; private List<Card> mCards; private Map<Card, Integer> mCardToHeader; private int mCachedHeaderBgColor; private float mCachedHeaderTextSize; public CardConfigAdapter(Context context) { mContext = context; mHeaders = Db.getCardSets(); mCards = new ArrayList<Card>(); mCardToHeader = new HashMap<Card, Integer>(); // Construct the items list - each card set, followed by all cards in it for (int a = 0; a < mHeaders.size(); a++) { CardSet cardSet = mHeaders.get(a); mCards.addAll(cardSet.getCards()); for (Card card : cardSet.getCards()) { mCardToHeader.put(card, a); } } Resources res = context.getResources(); mCachedHeaderBgColor = res.getColor(android.R.color.holo_blue_light); mCachedHeaderTextSize = res.getDimensionPixelSize(R.dimen.text_size_row_header); } @Override public int getCount() { return mCards.size(); } @Override public Card getItem(int position) { return mCards.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflateRow(parent); } ViewHolder holder = (ViewHolder) convertView.getTag(); Card card = getItem(position); holder.mIcon.bind(card, false); holder.mLabel.setText(card.getName(mContext)); return convertView; } private static class ViewHolder { public IconView mIcon; public TextView mLabel; public CheckBox mCheckBox; } private View inflateRow(ViewGroup parent) { View view = LayoutInflater.from(mContext).inflate(R.layout.row_card_checkable, parent, false); ViewHolder holder = new ViewHolder(); holder.mIcon = Ui.findView(view, R.id.icon_view); holder.mLabel = Ui.findView(view, R.id.label_text_view); holder.mCheckBox = Ui.findView(view, R.id.checkbox); view.setTag(holder); return view; } ////////////////////////////////////////////////////////////////////////// // StickyListHeadersAdapter public CardSet getHeaderItem(int position) { return mHeaders.get(mCardToHeader.get(mCards.get(position))); } @Override public long getHeaderId(int position) { return mCardToHeader.get(mCards.get(position)); } @Override public View getHeaderView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflateRow(parent); holder = (ViewHolder) convertView.getTag(); convertView.setBackgroundColor(mCachedHeaderBgColor); holder.mIcon.setVisibility(View.GONE); holder.mLabel.setTextAppearance(mContext, android.R.style.TextAppearance_Inverse); holder.mLabel.setTypeface(FontCache.getTypeface(mContext, mContext.getString(R.string.font_crash_landing))); holder.mLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCachedHeaderTextSize); } else { holder = (ViewHolder) convertView.getTag(); } CardSet cardSet = getHeaderItem(position); holder.mLabel.setText(cardSet.getNameResId()); holder.mCheckBox.setChecked(cardSet.areAllCardsEnabled()); // So that changing checked state doesn't cause an animation ViewCompat.jumpDrawablesToCurrentState(holder.mCheckBox); return convertView; } }