Reputation: 260
I am new in Android programming, I created a quiz app now I want to shuffle the questions of my Array in a random row. I have a Main Activity and a QuestionLibrary there I have 3 Arrays one for the questions, one for th chices, one for the answers.. Now i want to randomize the question row. How can do that? i tried several methods with one only Array but it is full of errors... How can i do it? Can you send me the solution with my method-variable names?
QuestionLibrary:
private String mChoices[][] = {
{"1993", "1986", "1967"},
{"-260", "-272,15", "279,15"},
{"a plant","The active substance of marijuana" , "a spider"},
{"6", "10","8"},
{"12","15","10"},
{"Uranus","Neptune","Saturn"},
{"HCl","NaCl","CO"},
{"John F. Kennedy", "Richard Nixon","James A. Garfield"},
{"Canada","Denmark", "Greenland is an own state?"},
{"12","20","14"},
{"10","12","14"},
{"not","never","now"},
{"Leningrad","Wolgograd","Dimitrijgrad"}
};
private String mCorrectAnswers[] = {"1993", "-272,15", "The active substance of marijuana", "8", "12","Uranus","NaCl","John F. Kennedy","Denmark","12","14","not","Wolgograd"};
public String getQuestion (int a){
String question = mQuestions[a];
return question;
}
public String getChoice1 (int a){
String choice0 = mChoices[a][0];
return choice0;
}
public String getChoice2 (int a) {
String choice1 = mChoices[a][1];
return choice1;
}
public String getChoice3 (int a) {
String choice2 = mChoices [a] [2];
return choice2;
}
public String getCorrectAnswer (int a){
String answer = mCorrectAnswers [a];
return answer;
}
public int getlength() {
int length = 13;
return length;
}
Main Activity:
package amapps.impossiblequiz;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class QuizActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mToggle;
private Toolbar mToolbar;
private MenuItem menuItem;
private Intent in;
private QuestionLibrary mQuestionLibrary = new QuestionLibrary();
private TextView mScoreView;
private TextView mQuestionView;
private Button mButtonChoice1;
private Button mButtonChoice2;
private Button mButtonChoice3;
private String mAnswer;
private int mScore = 0;
private int mQuestionNumber = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
mToolbar = (Toolbar) findViewById(R.id.nav_action);
setSupportActionBar(mToolbar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
mToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open, R.string.close);
mDrawerLayout.addDrawerListener(mToggle);
mToggle.syncState();
getSupportActionBar().setDisplayHomeAsUpEnabled(true); //Able to see the Navigation Burger "Button"
NavigationView mNavigationView = (NavigationView) findViewById(R.id.nv1);
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener(){
@Override
public boolean onNavigationItemSelected(MenuItem menuItem){
switch (menuItem.getItemId()){
case(R.id.nav_stats):
Intent accountActivity = new Intent(getApplicationContext(),Menu2.class);
startActivity(accountActivity);
}
return true;
}
});
mScoreView = (TextView) findViewById(R.id.score);
mQuestionView = (TextView) findViewById(R.id.question);
mButtonChoice1 = (Button) findViewById(R.id.choice1);
mButtonChoice2 = (Button) findViewById(R.id.choice2);
mButtonChoice3 = (Button) findViewById(R.id.choice3);
updateQuestion();
//Start of Button Listener1
mButtonChoice1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//My logic for Button goes in here
if (mButtonChoice1.getText() == mAnswer) {
mScore = mScore + 1;
updateScore(mScore);
updateQuestion();
//This line of code is optional...
Toast.makeText(QuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(QuizActivity.this, "Wrong... Try again!", Toast.LENGTH_SHORT).show();
mScore = 0;
updateScore(mScore);
updateQuestion();
}
}
});
//End of Button Listener1
//Start of Button Listener2
mButtonChoice2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//My logic for Button goes in here
if (mButtonChoice2.getText() == mAnswer) {
mScore = mScore + 1;
updateScore(mScore);
updateQuestion();
//This line of code is optional...
Toast.makeText(QuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(QuizActivity.this, "Oh... wrong your score is 0", Toast.LENGTH_SHORT).show();
mScore = 0;
updateScore(mScore);
updateQuestion();
}
}
});
//End of Button Listener2
//Start of Button Listener3
mButtonChoice3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//My logic for Button goes in here
if (mButtonChoice3.getText() == mAnswer) {
mScore = mScore + 1;
updateScore(mScore);
updateQuestion();
//This line of code is optional...
Toast.makeText(QuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(QuizActivity.this, "Come on, that was not so hard...", Toast.LENGTH_SHORT).show();
mScore = 0;
updateScore(mScore);
updateQuestion();
}
}
});
//End of Button Listener3
}
private void updateQuestion() {
if (mQuestionNumber < mQuestionLibrary.getlength()) {
mQuestionView.setText(mQuestionLibrary.getQuestion(mQuestionNumber));
mButtonChoice1.setText(mQuestionLibrary.getChoice1(mQuestionNumber));
mButtonChoice2.setText(mQuestionLibrary.getChoice2(mQuestionNumber));
mButtonChoice3.setText(mQuestionLibrary.getChoice3(mQuestionNumber));
mAnswer = mQuestionLibrary.getCorrectAnswer(mQuestionNumber);
mQuestionNumber++;
} else Toast.makeText(QuizActivity.this, "Last Question!", Toast.LENGTH_SHORT).show();
}
private void updateScore(int point) {
mScoreView.setText("" + mScore);
}
@Override //Makes that the "Burger" Item, shows the Drawer if someone clicks on the simbol
public boolean onOptionsItemSelected(MenuItem item) {
if (mToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Upvotes: 1
Views: 199
Reputation:
You should change QuestionLibrary
class like this.
public class QuestionLibrary {
private final String mChoices[][] = { /* ... */ };
private final String mQuestions[] = { /* ... */ };
private final String mCorrectAnswers[] = { /* ... */ };
private final List<Integer> indexes = new ArrayList<>();
public QuestionLibrary() {
for (int i = 0; i < mQuestions.length; ++i)
indexes.add(i);
}
private int index(int i) {
return indexes.get(i);
}
public String getQuestion(int a) {
return mQuestions[index(a)];
}
public String getChoice1(int a) {
return mChoices[index(a)][0];
}
public String getChoice2(int a) {
return mChoices[index(a)][1];
}
public String getChoice3(int a) {
return mChoices[index(a)][2];
}
public String getCorrectAnswer(int a) {
return mCorrectAnswers[index(a)];
}
public int getlength() {
return mQuestions.length;
}
public void shuffle() {
Collections.shuffle(indexes);
}
}
Then you can shuffle it like this.
QuestionLibrary q = new QuestionLibrary();
System.out.printf("Question:0 Choice:(%s, %s, %s) Answer:%s%n",
q.getChoice1(0), q.getChoice2(0), q.getChoice3(0), q.getCorrectAnswer(0));
q.shuffle();
System.out.printf("Question:0 Choice:(%s, %s, %s) Answer:%s%n",
q.getChoice1(0), q.getChoice2(0), q.getChoice3(0), q.getCorrectAnswer(0));
result:
Question:0 Choice:(1993, 1986, 1967) Answer:1993
Question:0 Choice:(-260, -272,15, 279,15) Answer:-272,15
Upvotes: 1
Reputation: 131346
Use a Random
instance and the nextInt(int n)
method where n
is the size of your array.
And repeat the operation to sort all elements of it.
Or better you may use Collections.shuffle(List<?> list)
if you replace your array by a List.
Upvotes: 0