私は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クラスで何を変更する必要がありますか?前もって感謝します。
こんにちはzon7、ご返信ありがとうございます。別のクラスを作成する代わりに、コードのその部分を変更する方法はありますか? –
final SQLDatabaseT1 sqldb = new SQLDatabaseT1(this); questionsList = sqldb.getAllQuestions(); ? –
2つのアクティビティ番号から質問にアクセスできるようにする場合は、シングルトンであるか、そのうちの1つに静的変数を使用して質問を格納します。別のクラスを追加するとどうなりますか? – zon7