/* * Copyright 2015 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.topeka.adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.google.samples.apps.topeka.model.Category; import com.google.samples.apps.topeka.model.quiz.AlphaPickerQuiz; import com.google.samples.apps.topeka.model.quiz.FillBlankQuiz; import com.google.samples.apps.topeka.model.quiz.FillTwoBlanksQuiz; import com.google.samples.apps.topeka.model.quiz.FourQuarterQuiz; import com.google.samples.apps.topeka.model.quiz.MultiSelectQuiz; import com.google.samples.apps.topeka.model.quiz.PickerQuiz; import com.google.samples.apps.topeka.model.quiz.Quiz; import com.google.samples.apps.topeka.model.quiz.SelectItemQuiz; import com.google.samples.apps.topeka.model.quiz.ToggleTranslateQuiz; import com.google.samples.apps.topeka.model.quiz.TrueFalseQuiz; import com.google.samples.apps.topeka.widget.quiz.AbsQuizView; import com.google.samples.apps.topeka.widget.quiz.AlphaPickerQuizView; import com.google.samples.apps.topeka.widget.quiz.FillBlankQuizView; import com.google.samples.apps.topeka.widget.quiz.FillTwoBlanksQuizView; import com.google.samples.apps.topeka.widget.quiz.FourQuarterQuizView; import com.google.samples.apps.topeka.widget.quiz.MultiSelectQuizView; import com.google.samples.apps.topeka.widget.quiz.PickerQuizView; import com.google.samples.apps.topeka.widget.quiz.SelectItemQuizView; import com.google.samples.apps.topeka.widget.quiz.ToggleTranslateQuizView; import com.google.samples.apps.topeka.widget.quiz.TrueFalseQuizView; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Adapter to display quizzes. */ public class QuizAdapter extends BaseAdapter { private final Context mContext; private final List<Quiz> mQuizzes; private final Category mCategory; private final int mViewTypeCount; private List<String> mQuizTypes; public QuizAdapter(Context context, Category category) { mContext = context; mCategory = category; mQuizzes = category.getQuizzes(); mViewTypeCount = calculateViewTypeCount(); } private int calculateViewTypeCount() { Set<String> tmpTypes = new HashSet<>(); for (int i = 0; i < mQuizzes.size(); i++) { tmpTypes.add(mQuizzes.get(i).getType().getJsonName()); } mQuizTypes = new ArrayList<>(tmpTypes); return mQuizTypes.size(); } @Override public int getCount() { return mQuizzes.size(); } @Override public Quiz getItem(int position) { return mQuizzes.get(position); } @Override public long getItemId(int position) { return mQuizzes.get(position).getId(); } @Override public int getViewTypeCount() { return mViewTypeCount; } @Override public int getItemViewType(int position) { return mQuizTypes.indexOf(getItem(position).getType().getJsonName()); } @Override public boolean hasStableIds() { return true; } @Override public View getView(int position, View convertView, ViewGroup parent) { final Quiz quiz = getItem(position); if (convertView instanceof AbsQuizView) { if (((AbsQuizView) convertView).getQuiz().equals(quiz)) { return convertView; } } convertView = getViewInternal(quiz); return convertView; } private AbsQuizView getViewInternal(Quiz quiz) { if (null == quiz) { throw new IllegalArgumentException("Quiz must not be null"); } return createViewFor(quiz); } private AbsQuizView createViewFor(Quiz quiz) { switch (quiz.getType()) { case ALPHA_PICKER: return new AlphaPickerQuizView(mContext, mCategory, (AlphaPickerQuiz) quiz); case FILL_BLANK: return new FillBlankQuizView(mContext, mCategory, (FillBlankQuiz) quiz); case FILL_TWO_BLANKS: return new FillTwoBlanksQuizView(mContext, mCategory, (FillTwoBlanksQuiz) quiz); case FOUR_QUARTER: return new FourQuarterQuizView(mContext, mCategory, (FourQuarterQuiz) quiz); case MULTI_SELECT: return new MultiSelectQuizView(mContext, mCategory, (MultiSelectQuiz) quiz); case PICKER: return new PickerQuizView(mContext, mCategory, (PickerQuiz) quiz); case SINGLE_SELECT: case SINGLE_SELECT_ITEM: return new SelectItemQuizView(mContext, mCategory, (SelectItemQuiz) quiz); case TOGGLE_TRANSLATE: return new ToggleTranslateQuizView(mContext, mCategory, (ToggleTranslateQuiz) quiz); case TRUE_FALSE: return new TrueFalseQuizView(mContext, mCategory, (TrueFalseQuiz) quiz); } throw new UnsupportedOperationException( "Quiz of type " + quiz.getType() + " can not be displayed."); } }