1

私はAndroid Appでクイズセクションを作っています。私はデータベースを作って、プログラムがテーブルからランダムな行(質問)を選択するようにしました。これらのランダムな質問は、実際のクイズに表示されます。その後、ユーザーは、どの質問が正しいか間違っているかを確認できます。問題は、正しい回答が表示されているアクティビティでは、質問がクイズ内の質問とは完全に異なっていることです。彼らは何らかの形で無作為化されているようだ。Android Studioのデータベースから選択したランダム行リストから正しい行を表示するにはどうすればよいですか?

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); 
} 

}:これは、ユーザーによって行われた正解と回答を示して質問リストが表示されているクラスが

// 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; 
} 

です:

この

は、Databaseクラスからの抜粋です

写真は、質問が正解リストと完全に異なる例を示しています。残りの唯一のことは、ユーザーが行った答えです。 Question Answers list

私はQuizViewAnswers1クラスで何を変更する必要がありますか?前もって感謝します。

答えて

0

問題はsqldb.getAllQuestions()で再度質問を取得してから、再度ランダム化されるという問題があります。

これを行う方法は、取得した同じデータセットを使用して質問することです。いくつかの一般的な場所(たぶんシングルトンクラス)に保存して、クイズアクティビティと結果アクティビティの両方からアクセスしてください。

+0

こんにちはzon7、ご返信ありがとうございます。別のクラスを作成する代わりに、コードのその部分を変更する方法はありますか? –

+0

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

+0

2つのアクティビティ番号から質問にアクセスできるようにする場合は、シングルトンであるか、そのうちの1つに静的変数を使用して質問を格納します。別のクラスを追加するとどうなりますか? – zon7