【问题标题】:Arraylist with multi answers android studio quiz app带有多个答案的 Arraylist android studio 测验应用程序
【发布时间】:2019-05-03 06:58:31
【问题描述】:

我正在制作一个测验应用程序并使用 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 个答案“大西洋或北冰洋或印度洋或太平洋或南部海洋” 我怎样才能让它工作?谢谢。

【问题讨论】:

  • 究竟是什么阻止了你让它发挥作用?
  • 我无法一次回答 2 个问题。所以我必须做一些事情让它接受所有的答案,用户可以写其中一个并转到下一个问题

标签: java android arrays android-studio


【解决方案1】:

基本上:通过更改数据模型。

你看,你创建你的类来“建模”现实。如果您想允许多个答案,那么简单的一对一映射(正如 QuestionModel 所暗示的那样)根本行不通。那么您的模型应该是 1:n,例如 1 个问题字符串,但答案可能是 List&lt;String&gt;。对于只有一个答案的问题,该列表只包含一个条目。

这就是去那里的方法:首先你想出你的数据需要如何组织,然后你构建一切,包括围绕它的 UI 结构。

【讨论】:

    【解决方案2】:

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

    我有一个问题和任意数量的答案,但它们都必须来自同一个枚举。我可以创建更多枚举,然后使用不同的答案创建更多问题。

    【讨论】:

    • 是枚举的新手,不知道如何使用它。所以我试图学习它并让它为我工作大约 6 个小时,但它没有。如果您能提供我最终编辑的代码,我将不胜感激。我厌倦了没有希望的尝试:(
    • @j.ibra10 很好,但我会给你 Kotlin 代码,因为如果你是初学者,你为什么还要去做其他事情? XD
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多