我正在开发一个测验应用程序,该应用程序从我的数据库中获取一组问题,并在点击按钮后显示每个问题,最好不要重复相同的问题。我有一个名为初始化的方法,它从我的数据库中获取两个数组的数组,然后将其拆分为两个单独的数组。然后我想在另一个方法中使用其中一个数组。这是第一种方法(目前我从列表中创建一个数组字符串并将其存储为全局变量以供将来使用 - 我也使用该列表中的随机值显示在textview中):
private class showNextRandomQuestion extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
SQLDatabaseHelper db = new SQLDatabaseHelper(MainActivity.this);
//get the data from the database
List<List<String>> listList = db.getAllAnswersByQuestion2();
//Get the question/text/answer Strings
List<String> questionStrings = listList.get(0); //question Strings
List<String> answerSetIds = listList.get(1);
//Generate random index
Random r = new Random();
int rand = Math.abs((r.nextInt() % questionStrings.size()));
//get answer description for randomly selected question
String questionString = questionStrings.get(rand);
String answerSetId = answerSetIds.get(rand);
questionstringarray = questionStrings.toString();
//remove and square brackets from array of strings
String regex = "\\[|\\]";
answerId = answerSetId.replaceAll(regex, "");
mQuestionString = questionString.replaceAll(regex, "");
return mQuestionString;
}
@Override
protected void onPostExecute(String result) {
//take returned question from above and display it
questionView.setText(mQuestionString);
}
}
我出于某种原因真的很难弄清楚如何使用列表而不是将其转换为字符串数组('questionstringarray')。你会看到我的下一个方法,它是由按钮点击触发的,我曾尝试将该字符串数组转回列表,所以我可以再次使用它。
private class showNextRandomQuestion2 extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
List<String> array1 = new ArrayList<String>();
//remove and square brackets from array of strings
String regex = "\\[|\\]";
questionstringarray = questionstringarray.replaceAll(regex, "");
StringTokenizer questionDescr = new StringTokenizer(questionstringarray, ",");
first = questionDescr.nextToken();
first = first.trim();
second = questionDescr.nextToken();
second = second.trim();
third = questionDescr.nextToken();
third = third.trim();
fourth = questionDescr.nextToken();
fourth = fourth.trim();
fifth = questionDescr.nextToken();
fifth = fifth.trim();
array1.add(first);
array1.add(second);
array1.add(third);
array1.add(fourth);
array1.add(fifth);
Collections.shuffle(array1);
//remove and square brackets from array of strings
String regex1 = "\\[|\\]";
//remove values from string when shuffling through so not repeated
String bQuestionText = array1.remove(0);
bQuestionString = bQuestionText.replaceAll(regex1, "");
return bQuestionString;
}
@Override
protected void onPostExecute(String result) {
//take returned question from above and display it
questionView.setText(bQuestionString);
}
}
我显然不希望从一个方法中的列表转换为仅将其转换回下一个列表。最终我想要第一种方法从我的数据库获取数据,我很满意 - 显示该方法中的一个字符串,然后存储相同的列表,以便在另一个方法中使用,我将在列表中显示下一个字符串(希望如此然后从列表中删除它)并在按钮上单击显示然后下一个字符串,然后.... - 因此'Collections.shuffle'。
任何帮助表示赞赏。感谢
这是我的新类,它检索并存储列表以供进一步使用:
package com.example.quizapp;
import java.util.List;
import android.app.Application;
public class QuizQuestionBank extends Application {
@SuppressWarnings("unused")
private List<String> questionStrings;
public List<String> getQuestionStrings(List<String> questionStrings2) {
SQLDatabaseHelper db = new SQLDatabaseHelper(QuizQuestionBank.this);
//get the data from the database
List<List<String>> listList = db.getAllAnswersByQuestion2();
// questionStrings.clear();
//Get the question/text/answer Strings
List<String> questionStrings = listList.get(0); //question Strings
// List<String> answerSetIds = listList.get(1);
return questionStrings;
}
public List<String> setQuestionStrings(List<String> questionStrings) {
return this.questionStrings = questionStrings;
}
}
答案 0 :(得分:0)
理想情况下,您有三个问题; 1.从数据库返回所需数据,确保其格式适合所有客户端方法。 2.存储返回的数据 3.从返回的数据中选择(随机)问题。
我会在一个方法中从数据库返回数据,然后我将从中返回一个类的实例变量,也许称为QuizQuestionBank
或其他方法。这将有一个方法可以从中返回一个问题。
这种方法返回问题可以从列表中选择一个随机问题,也可以简单地从顶部选择一个问题,或者从列出中删除使用过的问题。根据您的要求,它对客户端类是透明的,所有客户端类都知道它是否在QuizQuestionBank
上调用方法并返回一个问题,它会担心如何存储或选择该问题。
答案 1 :(得分:0)
最简单的方法是为Question对象使用一个类。 在列表变量中从db获取问题列表之后,使用setter方法将该变量数据与Application Class一起存储,并在需要时通过调用活动内部的getter方法(Application类)来获取它。 并在开始测验会话之前使用任何改组方法(测试的新尝试)。
<强>编辑:强> 使用方式如下:
package com.example.quizapp;
import java.util.List;
import android.app.Application;
public class QuizQuestionBank extends Application {
@SuppressWarnings("unused")
private List<String> questionStrings;
public List<String> getQuestionStrings() {
return questionStrings;
}
public List<String> setQuestionStrings(List<String> questionStrings) {
return this.questionStrings = questionStrings;
}
}
现在使用代码从数据库中获取数据一次,然后再开始测验, 并使用setter方法将该数据放入QuizQuestionBank类的questionStrings变量中。 从下面的活动中设置它:
((QuizQuestionBank) getApplication()).setQuestionStrings(List<String> questionStrings);
并在以下活动中获取它:
List<String> questionStrings = ((QuizQuestionBank) getApplication()).getQuestionStrings();
或在片段中获取它:
List<String> questionStrings = ((QuizQuestionBank) getActivity().getApplication()).getQuestionStrings();
如果有其他类:
List<String> questionStrings = ((QuizQuestionBank) context.getApplicationContext()).getQuestionStrings();
其中context(Context type)将使用传递的上下文参数进行初始化。