2015-06-16 43 views
1

我有一个测验应用程序,它显示了几个来自SQLite Db的问题,它有50个问题,但它必须在游戏部分显示5个问题,并将随机化这些问题。Android ::我如何随机化我的测验问题?

我厌倦了为解决多次,但没有:/

在源代码中QID是分贝。基于显示问题并找到答案的ID主键。

这里的活动:

package com.example.quiz; 

import java.util.List; 
import java.util.Random; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.database.DatabaseUtils; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.TextView; 

public class QuizActivity extends Activity { 
    private static final DbHelper remote = null; 
    List <Question> quesList; 
    int score = 0; 

    Question currentQ; 
    TextView txtQuestion; 
    RadioButton rda, rdb, rdc, rdd; 
    Button butNext; 

    int qid; 
    int qNumber = 0; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_quiz); 
     DbHelper db = new DbHelper(this); 

     quesList = db.getAllQuestions(); 
     currentQ = quesList.get(qid); 

     txtQuestion = (TextView)findViewById(R.id.textView1); 
     rda = (RadioButton)findViewById(R.id.radio0); 
     rdb = (RadioButton)findViewById(R.id.radio1); 
     rdc = (RadioButton)findViewById(R.id.radio2); 
     rdd = (RadioButton)findViewById(R.id.radio3); 
     butNext = (Button)findViewById(R.id.button1); 

     setQuestionView(); 

     butNext.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       RadioGroup grp=(RadioGroup)findViewById(R.id.radioGroup1); 
       RadioButton answer=(RadioButton)findViewById(grp.getCheckedRadioButtonId()); 

       Log.d("yourans", currentQ.getANSWER()+" "+answer.getText()); 

       if(currentQ.getANSWER().equals(answer.getText())) 
       { 
        score++; 
        Log.d("score", "Your score"+score); 
       } 

       if(qNumber < 5){  

        currentQ = quesList.get(qid); 
        setQuestionView(); 
       } 

       else 

       { 
        Intent intent = new Intent(QuizActivity.this, ResultActivity.class); 
        Bundle b = new Bundle(); 
        b.putInt("score", score); //Pontunk 
        intent.putExtras(b); //Pont tovább vivése a következő kérdéshez 
        startActivity(intent); 
        finish(); 
       } 
      } 
     }); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.quiz, menu); 
     return true; 
    } 
    private void setQuestionView() 
    { 
     txtQuestion.setText(currentQ.getQUESTION()); 
     rda.setText(currentQ.getOPTA()); 
     rdb.setText(currentQ.getOPTB()); 
     rdc.setText(currentQ.getOPTC()); 
     rdd.setText(currentQ.getOPTD()); 

     Random rand = new Random(); 
     for(int i=0; i<5;i++){ 
     int r1 = rand.nextInt(50) + 1; 
     qid = r1; 
     } 
     qNumber++; 
    } 
} 

当qNumber的值超过5时,重定向到ResultsActivity。 我测试了它,它的工作,显示了随机问题,但有时程序崩溃了。 我错在哪里,为什么不正常的工作随机化?

感谢您的帮助,并对不起我的英语知识!

+0

为什么不选择一个随机的非经常性指数,只是拉该索引的问题吗? – Adam

+0

好主意,谢谢! – Brhama

回答

1

您可以获取通过运行此查询的随机问题:

db.rawQuery("SELECT * FROM YOUR_TABLE ORDER BY RANDOM() LIMIT 5", null);

+0

感谢您的帮助! 我不知道用SQL更容易。 – Brhama

0

最重要的是检查崩溃信息:它会告诉你在哪里看。

不过,我想我可以看到这个问题。你的随机数发生器返回一个介于0和49之间的值,然后加1,将变量qid中的值放置在1到50的范围内。但是List是基于零的,所以当你访问元素50时它会崩溃。 (问题0将永远不会被访问)。