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類中更改什麼?提前致謝。
嗨zon7,謝謝你的回覆。有什麼辦法可以改變那部分代碼而不是製作一個單獨的類: –
final SQLDatabaseT1 sqldb = new SQLDatabaseT1(this); questionsList = sqldb.getAllQuestions(); ? –
如果你想從兩個活動沒有問題可以訪問的問題。是一個單身人士或在其中一個使用靜態變量來存儲問題。添加其他課程有什麼問題? – zon7