In the following activity in my app (multiplication quiz game) I have displayed a list of questions and answers that the user has given. At present it displays the answer in red if it was wrong and green if correct. The sub item of the list will always be the correct answer (in green). I want the sub item to only be displayed if the answer is incorrect. I.e. no need to display the correct answer twice. But I am unsure how to do so.
Image of activity (note how correct answer is displayed in sub item even if user has already given the correct answer):
Code of Activity:
public class RandomTestResults extends Activity {
// Set up variables
TextView scoreText;
String phrase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testresults);
// List view to hold the test results
ListView itemList = (ListView) findViewById(R.id.lvRandomTestresults);
// getting data from the previous activity via intents
int[] results = getIntent().getIntArrayExtra("results");
String[] questions = getIntent().getStringArrayExtra("Questions");
int[] correctAnswer = getIntent().getIntArrayExtra("CorrectAnswer");
int score = getIntent().getIntExtra("score", 0);
// if else statements to determine what phrase to present to user
if (score <= 4) {
phrase = "Please try again! ";
} else if (score <= 6) {
phrase = "Good effort! ";
} else if (score <= 9) {
phrase = "Well done! ";
} else if (score == 10) {
phrase = "Perfect! ";
}
// Set text to tell user what they scored in test
scoreText = (TextView) findViewById(R.id.tvRandomTestresults);
scoreText.setText(phrase + "You got " + score + " correct out of 10!");
// ArrayList containing Hashmap
ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
// loop to give list view (10 items and sub items)
for (int i = 1; i <= 10; i++) {
// set userAnswer equal to correct place in results array
int userAnswer = results[i - 1];
// Setting expected answer to correct place in correctAnswer array
int expectedAnswer = correctAnswer[i - 1];
// Set string to present to user
String userString = questions[i - 1] + " " + userAnswer; // mybe
// change
// correct answer
String expectedString = "" + expectedAnswer;
// HashMap containing 2 strings
HashMap<String, String> map = new HashMap<String, String>();
// add strings to HashMap
map.put("user", userString);
map.put("expected", expectedString);
// add HashMap to list
list.add(map);
}
// Instantiate custom array adapter
MyArrayAdapter adapter = new MyArrayAdapter(
this.getApplicationContext(), R.layout.list_row, list,
questions, results);
// Set custom adapter to your ListView.
itemList.setAdapter(adapter);
}
/**
* Method that ensures user is returned
* to main menu when they press back button
*/
@Override
public void onBackPressed() {
Intent t = new Intent(this, Menu.class);
startActivity(t);
}
}
Code of Adapter relating to activity:
public class MyArrayAdapter extends
ArrayAdapter<ArrayList<HashMap<String, String>>> {
Context mContext;
ArrayList<HashMap<String, String>> mQuestionArrayList;
int mLayoutResourceId;
String[] mQuestionsArray;
int[] mUsersAnswers;
/**
* Constructor with arguments
* @param context
* @param layoutResourceId
* @param questionsArrayList
* @param questionsArray
* @param usersAnswers
*/
public MyArrayAdapter(Context context, int layoutResourceId,
ArrayList<HashMap<String, String>> questionsArrayList,
String[] questionsArray, int[] usersAnswers) {
super(context, layoutResourceId);
mContext = context;
this.mQuestionArrayList = questionsArrayList;
this.mLayoutResourceId = layoutResourceId;
this.mQuestionsArray = questionsArray;
this.mUsersAnswers = usersAnswers;
}
/**
* Method that returns the size
* of the ArrayList
*/
@Override
public int getCount() {
return mQuestionArrayList.size();
}
/**
*
* Method that will get the view to display to user
*/
@Override
public View getView(int position, View row, ViewGroup parent) {
HashMap<String, String> question = mQuestionArrayList.get(position);
//set layout inflater equal to context
LayoutInflater inflater = LayoutInflater.from(mContext);
// Initialize the row layout by inflating the xml file list_row.
row = inflater.inflate(this.mLayoutResourceId, parent, false);
// Initialize TextViews defined in the list_row layout.
TextView questionTxtView = (TextView) row.findViewById(R.id.question);
TextView answerTxtView = (TextView) row.findViewById(R.id.answer);
TextView correctAnswerTxtView = (TextView) row
.findViewById(R.id.correct);
// Set text for each TextView
questionTxtView.setText(mQuestionsArray[position]);
answerTxtView.setText(String.valueOf(mUsersAnswers[position]));
correctAnswerTxtView.setText(question.get("expected").toString());
// Setting colour of the user answer dependent on if its correct
if (mUsersAnswers[position] != Integer.parseInt(question
.get("expected").toString()))
answerTxtView.setTextColor(Color.RED);
else
answerTxtView.setTextColor(Color.GREEN);
return row;
}
}
Maybe you can change the correctAnswerTxtView visibility depending on the answer of the user, something like this:
// Setting colour of the user answer dependent on if its correct
if (mUsersAnswers[position] != Integer.parseInt(question
.get("expected").toString())) {
answerTxtView.setTextColor(Color.RED);
correctAnswerTxtView.setVisibility(View.GONE);
}
else {
answerTxtView.setTextColor(Color.GREEN);
correctAnswerTxtView.setVisibility(View.VISIBLE);
}
Hope that helps.