Question

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):

enter image description here

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;
    }
}
Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top