Arraylist с несколькими ответами приложение для викторин от студии android

Я делаю приложение-викторину и использую ArrayList с. У меня проблема с ответами: он работает, когда у меня есть только один ответ, но что я могу сделать, если на вопрос есть два ответа?

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.util.ArrayList;

import cn.pedant.SweetAlert.SweetAlertDialog;

public class MainActivity extends AppCompatActivity {

    TextView questionLabel, questionCountLabel, scoreLabel;
    EditText answerEdt;
    Button submitButton;
    ProgressBar progressBar;
    ArrayList<QuestionModel> questionModelArraylist;


    int currentPosition = 0;
    int numberOfCorrectAnswer = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        questionCountLabel = findViewById(R.id.noQuestion);
        questionLabel = findViewById(R.id.question);
        scoreLabel = findViewById(R.id.score);

        answerEdt = findViewById(R.id.answer);
        submitButton = findViewById(R.id.submit);
        progressBar = findViewById(R.id.progress);

        questionModelArraylist = new ArrayList<>();

        setUpQuestion();

        setData();

        submitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                checkAnswer();
            }
        });

        answerEdt.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button
                Log.e("event.getAction()",event.getAction()+"");
                Log.e("event.keyCode()",keyCode+"");
                if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                        (keyCode == KeyEvent.KEYCODE_ENTER)) {

                    checkAnswer();
                    return true;
                }
                return false;
            }
        });

    }
    public void checkAnswer(){
        String answerString  = answerEdt.getText().toString().trim();




        if (answerString.equalsIgnoreCase(questionModelArraylist.get(currentPosition).getAnswer())){
            numberOfCorrectAnswer ++;



            new SweetAlertDialog(MainActivity.this, SweetAlertDialog.SUCCESS_TYPE)
                    .setTitleText("Sehr gut!")
                    .setContentText("Richtig!")
                    .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                        @Override
                        public void onClick(SweetAlertDialog sweetAlertDialog) {
                            currentPosition ++;

                            setData();
                            answerEdt.setText("");
                            sweetAlertDialog.dismiss();
                        }
                    })
                    .show();


        }else {

            new SweetAlertDialog(MainActivity.this, SweetAlertDialog.ERROR_TYPE)
                    .setTitleText("Falsch :(")
                    .setContentText("Die Richtige Antwort ist : "+questionModelArraylist.get(currentPosition).getAnswer())
                    .setConfirmText("OK")
                    .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                        @Override
                        public void onClick(SweetAlertDialog sDialog) {
                            sDialog.dismiss();

                            currentPosition ++;

                            setData();
                            answerEdt.setText("");
                        }
                    })
                    .show();
        }





        int x = ((currentPosition+1) * 100) / questionModelArraylist.size();

        progressBar.setProgress(x);



    }




    public void setUpQuestion(){


        questionModelArraylist.add(new QuestionModel("Write one planet located between Earth and the sun","Venus or Mercury"));

questionModelArraylist.add(new QuestionModel("the 5th planet from the sun","Jupiter"));

questionModelArraylist.add(new QuestionModel("write names of any two oceans","Atlantic Ocean or Arctic Ocean or Indian Ocean or Pacific Ocean orSouthern Ocean"));



    }

    public void setData(){


        if (questionModelArraylist.size()>currentPosition) {

            questionLabel.setText(questionModelArraylist.get(currentPosition).getQuestionString());

            scoreLabel.setText("Ergebnis :" + numberOfCorrectAnswer + "/" + questionModelArraylist.size());
            questionCountLabel.setText("Frage Nummer : " + (currentPosition + 1));


        }else{


            new SweetAlertDialog(MainActivity.this, SweetAlertDialog.SUCCESS_TYPE)
                    .setTitleText("Du bist Fertig :)")
                    .setContentText("dein Ergebnis ist : "+ numberOfCorrectAnswer + "/" + questionModelArraylist.size())
                    .setConfirmText("Wiederholen")
                    .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                        @Override
                        public void onClick(SweetAlertDialog sDialog) {

                            sDialog.dismissWithAnimation();
                            currentPosition = 0;
                            numberOfCorrectAnswer = 0;
                            progressBar.setProgress(0);
                            setData();
                        }
                    })
                    .setCancelText("schließen")
                    .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {
                        @Override
                        public void onClick(SweetAlertDialog sDialog) {

                            sDialog.dismissWithAnimation();
                            finish();
                        }
                    })
                    .show();

        }

    }



}

Вопрос Класс

public class QuestionModel {

    public QuestionModel(String questionString, String answer) {
        QuestionString = questionString;
        Answer = answer;
    }

    public String getQuestionString() {
        return QuestionString;
    }

    public void setQuestionString(String questionString) {
        QuestionString = questionString;
    }

    public String getAnswer() {
        return Answer;
    }

    public void setAnswer(String answer) {
        Answer = answer;
    }

    private String QuestionString;
    private String Answer;


}

Как видите, я хочу, чтобы ответ в первом вопросе был Меркурий или Венера, второй вопрос - Юпитер, а третий вопрос имеет 5 ответов: «Атлантический океан или Северный Ледовитый океан, Индийский океан, Тихий океан или Южный океан». как заставить его работать? Спасибо.

Что именно вам мешает заставить его работать?

Joe C 01.12.2018 09:36

Я не могу ответить одновременно на два ответа. поэтому мне нужно что-то сделать, чтобы он принял все ответы, и пользователь мог написать один из них и перейти к следующему вопросу

j.ibra10 01.12.2018 23:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
843
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В основном: изменяя вашу модель данных.

Видите ли, вы создаете свои классы, чтобы «моделировать» реальность. Если вы хотите разрешить несколько ответов, тогда простое сопоставление один-к-одному (как подразумевает QuestionModel) просто не работает. Тогда ваша модель должна быть 1: n, как 1 строка вопроса, но ответом может быть, например, List<String>. Для вопросов, на которые есть только один ответ, этот список просто содержит только одну запись.

Это путь туда: первый вы придумываете, как ваши данные должны быть организованы, затем вы строите все вокруг, включая структуры пользовательского интерфейса.

Ответ принят как подходящий

@GhostCat верен, вы должны проанализировать его перед реализацией. Для вашей конкретной ситуации я думаю, что перечисления могут быть полезны. Я не совсем понимаю вашу цель, но поначалу я бы подошел к ней именно так.

И чтобы обобщить это в вашем классе QuestionModel, я бы сначала создал интерфейс, чтобы описать любой возможный ответ.

interface AnswerInterface {
    val value: String
}

Я бы использовал дженерики, расширяющие этот интерфейс, и тогда моя QuestionModel стала бы такой.

class QuestionModel<QuestionAnswer : AnswerInterface>(
        var question: String,
        vararg answers: QuestionAnswer
)

QuestionAnswer может быть любым классом, который реализует AnswerInterface, а varard означает, что я могу иметь любое количество ответов в качестве ответов.

Имея это в виду, мои ответы будут следующими:

enum class PlanetAnswers(override val value: String) : AnswerInterface {
    VENUS("Venus"),
    MERCURY("Mercury"),
    JUPITER("Jupiter")
}

Наконец, все взаимосвязано так:

val question1 = QuestionModel("One planet between Earth and Sun?", PlanetAnswers.VENUS, PlanetAnswers.MERCURY)
val question2 = QuestionModel("The 5th planet from the Sun?", PlanetAnswers.JUPITER)

У меня есть вопрос и множество ответов, но все они должны происходить из одного и того же перечисления. Я могу создать больше перечислений, а затем создать больше вопросов с другим набором ответов.

Я новичок в enum и не знаю, как его использовать. поэтому я пытался выучить его и заставить его работать у меня около 6 часов, но этого не произошло. Если вы предоставите мне окончательно отредактированный код, я буду вам благодарен. устал без надежды пытаться :(

j.ibra10 01.12.2018 23:58

@ j.ibra10 нормально, но я дам вам код Kotlin, потому что, если вы новичок, зачем вам делать что-то еще? XD

iFanie 02.12.2018 21:34

Другие вопросы по теме