1

我在我的Android应用程序中进行测验。我创建了一个数据库,并且创建了它,程序从表中选择了随机行(问题)。然后,这些随机问题将显示在实际测验中,然后用户可以看到他回答对对错的问题。问题是,在显示正确答案的活动中,问题与测验中的问题完全不同。他们似乎也以某种方式随机化。如何从Android Studio中的数据库中选择的随机行列表中显示正确的行?

这是从数据库类的提取物:

// Table Columns names 
private static final String KEY_ID = "id"; 
private static final String KEY_QUESTION = "question"; 
private static final String KEY_ANSWER = "answer"; //correct option 
private static final String KEY_OPTA = "opta"; //option a 
private static final String KEY_OPTB = "optb"; //option b 
private static final String KEY_OPTC = "optc"; //option c 
private static final String KEY_OPTD = "optd"; //option d 

private SQLiteDatabase myDatabase; 

public SQLDatabaseT1(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db1) { 

    myDatabase=db1; 

    // A new table is created if there is none 
    String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_QUESTION + " (" 
      + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_QUESTION 
      + " TEXT, " + KEY_ANSWER + " TEXT, "+ KEY_OPTA +" TEXT, " 
      + KEY_OPTB +" TEXT, "+ KEY_OPTC +" TEXT, " + KEY_OPTD + " TEXT)"; 

    db1.execSQL(sql); 

    // Adds questions from this method below 
    addQuestions1(); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db1, int oldV, int newV) { 

    // Drop older table if existed 
    db1.execSQL("DROP TABLE IF EXISTS " + TABLE_QUESTION); 

    // Creates tables again 
    onCreate(db1); 
} 

// Takes 7 random rows from the table and puts into the topic quiz 
public Cursor getRandomDataItemFromDb(String TABLE_QUESTION, String limit) { 
    SQLiteDatabase db1 = this.getWritableDatabase(); 
    Cursor cursor = db1.rawQuery("SELECT * FROM " + TABLE_QUESTION + " ORDER BY RANDOM() LIMIT 7", null); 
    if (cursor.moveToFirst()) { 
     return cursor; 
    } 
    return cursor; 
} 

// Sets the limit of how many questions will be in the quiz 
public int rowCount() 
{ 
    int row=7; //There will be 7 questions in a quiz 
    return row; 
} 

public List<Question> getAllQuestions() { 

    List<Question> quesList = new ArrayList<Question>(); 

    String selectQuery = "SELECT * FROM " + TABLE_QUESTION + " ORDER BY RANDOM() LIMIT 7"; 

    myDatabase=this.getReadableDatabase(); 

    Cursor cursor = myDatabase.rawQuery(selectQuery, null); 

    if (cursor.moveToFirst()) { 
     do { 
      Question quest = new Question(); 
      quest.setId(cursor.getInt(0)); 
      quest.setQUESTION(cursor.getString(1)); 
      quest.setANSWER(cursor.getString(2)); 
      quest.setOptionA(cursor.getString(3)); 
      quest.setOptionB(cursor.getString(4)); 
      quest.setOptionC(cursor.getString(5)); 
      quest.setOptionD(cursor.getString(6)); 

      quesList.add(quest); 

     } while (cursor.moveToNext()); 
    } 
    // returns question list 
    return quesList; 
} 

这是示出了由用户进行的正确答案和答案其中显示问题列表中的类别:

public class QuizViewAnswers1 extends AppCompatActivity { 

private ListView listofAnswers; 

private List<Question> questionsList; 
private Question currentQuestion; 

ArrayList<HashMap<String, Object>> originalValues = new ArrayList<HashMap<String, Object>>(); 

HashMap<String, Object> temp = new HashMap<String, Object>(); 

public static String KEY_QUESTION = "questions"; 
public static String KEY_CANS = "canswer"; 
public static String KEY_YANS = "yanswer"; 

private CustomAdapter adapter; 

ArrayList<String> myAnsList = new ArrayList<String>(); 

Button homeQuiz; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.quiz_show_ans); 
    String selectQuery; 
    Intent in = getIntent(); 
    Bundle b = getIntent().getExtras(); 
    myAnsList=in.getExtras().getStringArrayList("myAnsList"); 

    listofAnswers=(ListView)findViewById(R.id.listofAnswers); 

    //Initialize the database 
    final SQLDatabaseT1 sqldb = new SQLDatabaseT1(this); 
    questionsList= sqldb.getAllQuestions(); 


    for (int i = 0; i < 7; i++) { 
     currentQuestion = questionsList.get(i); 
     temp = new HashMap<String, Object>(); 
     temp.put(KEY_QUESTION, currentQuestion.getQUESTION()); 
     temp.put(KEY_CANS, currentQuestion.getANSWER()); 
     temp.put(KEY_YANS, myAnsList.get(i)); 

     // add the row to the ArrayList 
     originalValues.add(temp); 

    } 

    adapter = new CustomAdapter(QuizViewAnswers1.this, R.layout.ans_list, originalValues); 
    listofAnswers.setAdapter(adapter); 

    homeQuiz = (Button) findViewById(R.id.quizHome); 
    homeQuiz.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(QuizViewAnswers1.this, Quiz.class); 
      startActivity(intent); 
      finish(); 
     } 
    }); 
} 

// define your custom adapter 
private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>> { 
    LayoutInflater inflater; 

    public CustomAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Object>> Strings) { 
     super(context, textViewResourceId, Strings); 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    // class for caching the views in a row 
    private class ViewHolder { 

     TextView viewQuestions, viewAnswers, yourAnswers; 

    } 

    ViewHolder viewHolder; 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 

      convertView = inflater.inflate(R.layout.ans_list, null); 
      viewHolder = new ViewHolder(); 

      viewHolder.viewQuestions = (TextView) convertView.findViewById(R.id.question); 

      viewHolder.viewAnswers = (TextView) convertView 
        .findViewById(R.id.correctanswer); 
      viewHolder.yourAnswers = (TextView) convertView 
        .findViewById(R.id.useranswer); 

      // link the cached views to the convertview 
      convertView.setTag(viewHolder); 

     } else 
      viewHolder = (ViewHolder) convertView.getTag(); 

     viewHolder.viewQuestions.setText(originalValues.get(position).get(KEY_QUESTION) 
       .toString()); 

     viewHolder.viewAnswers.setText("Correct Answer: " + originalValues.get(position).get(KEY_CANS) 
       .toString()); 
     viewHolder.yourAnswers.setText("Your Answer: " + originalValues.get(position) 
       .get(KEY_YANS).toString()); 

     // return the view to be displayed 
     return convertView; 
    } 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     // Respond to the action bar's Up/Home button 
     case android.R.id.home: 
      NavUtils.navigateUpFromSameTask(this); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}

图片显示的问题与“正确答案”列表中的问题完全不同。唯一剩下的就是用户所做的答案。 Question Answers list

我应该在QuizViewAnswers1类中更改什么?提前致谢。

回答

0

问题是您正在使用sqldb.getAllQuestions()再次提取问题,然后再次将它们随机化。

做到这一点的方法是使用您提取的相同数据集来提出问题。只需将它存储在一些常用的地方(单身班可能),并从测验活动和结果活动中访问它。

+0

嗨zon7,谢谢你的回复。有什么办法可以改变那部分代码而不是制作一个单独的类: –

+0

final SQLDatabaseT1 sqldb = new SQLDatabaseT1(this); questionsList = sqldb.getAllQuestions(); ? –

+0

如果你想从两个活动没有问题可以访问的问题。是一个单身人士或在其中一个使用静态变量来存储问题。添加其他课程有什么问题? – zon7

相关问题