在随机问题列表中创build一个“最喜爱的”function

我很难正确实现我的应用程序的“collections夹”function。 在对象列表中移动时,用户应该能够选中/取消选中某个项目。 一旦活动进入onPause(); 状态,它应该保存collections夹的列表(而是布尔标记的完整列表,用来表明是否是最喜欢的东西… true的最喜欢的, false的不是最喜欢的。)显然,在进入onResume(); 状态,应该加载列表,以便他们可以查看他们以前标记的collections夹。

我认为,我的问题确实来自这个事实,即在初始化时这个列表是随机的。 我确定我的algorithm是closures的,但是我已经尝试了各种方法,以至于我再也看不到它了。

主要活动Java

 public class MainActivity extends ActionBarActivity { Global global_main; @Override protected void onCreate(Bundle savedInstanceState) { global_main = Global.getInstance("all"); } @Override protected void onResume(){ super.onResume(); SharedPreferences settings = getSharedPreferences(FILE_FAVORITES, 0); for(int index = 0; index < TOTAL_QUESTIONS; index++){ boolean favFromFile = settings.getBoolean(("savedFavorite_" + String.valueOf(index)), false); global_main.setFav(index, favFromFile); } } @Override protected void onPause(){ super.onPause(); SharedPreferences settings = getSharedPreferences(FILE_FAVORITES, 0); SharedPreferences.Editor editor = settings.edit(); for(int index = 0; index < TOTAL_QUESTIONS; index++){ editor.putBoolean(("savedFavorite_" + String.valueOf(index)), global_main.getFav(index)); // Commit the edits! editor.commit(); } } 

练习Java

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); selectedSection = intent.getStringExtra(chooseSection.chosenSection); global = Global.getInstance(selectedSection); } 

全球一stream

 public class Global { private static Global global = null; //Current total of questions which the user has chosen //EX: if Multiplication was chosen and has 10 questions in the array //Then this equals 10 int CURRENT_TOTAL; //This is the position that the first question of the user's choice starts with //EX: If user chooses Multiplication, and the multiplication questions start at questions[19]; //Then this equals 19 int CURRENT_START; //This is the position that the last question of the user's choice ends with //EX: If user chooses Multiplication, and the multiplication questions end at questions[24]; //Then this equals 24 int CURRENT_END; //Basic question structure class questionStruct { String q; String a; int position; //original position in the array; boolean favorite; } //Array of question structures questionStruct[] questions = new questionStruct[TOTAL_QUESTIONS]; //userChoice is the choice of question type that the user has selected. //EX: Multiplication, Division, Addition, Subtraction, or All/Default public static Global getInstance(String userChoice) { if(global == null) { global = new Global(); global.initialize(); } global.getChoice(userChoice); global.setQuestionsDefault(); global.randomize(); return global; } public void initialize() { for (int i = 0; i < TOTAL_QUESTIONS; i++) { questions[i] = new questionStruct(); } questions[0].q = "Question 1 Text"; questions[0].a = "Answer"; questions[0].position = 0; questions[1].q = "Question 2 Text"; questions[1].a = "Answer"; questions[1].position = 1; questions[2].q = "Question 3 Text"; questions[2].a = "Answer"; questions[2].position = 2; ....ETC. ....ETC. ....ETC. } public void setQuestionsDefault(){ questionStruct temp = new questionStruct(); for(int index = 0; index < TOTAL_QUESTIONS; index++){ int count = questions[index].position; temp = questions[count]; questions[count] = questions[index]; questions[index] = temp; temp = null; } } //Randomize the questions only within the range of the category //which the user has chosen public void randomize(){ for(int index = CURRENT_END; index >= CURRENT_START; index --) { //Generate random number to switch with random block Random rand = new Random(); int currentQ = rand.nextInt((CURRENT_END - CURRENT_START) + 1) + CURRENT_START; //Switch two Question blocks questionStruct temp = questions[currentQ]; questions[currentQ] = questions[index]; questions[index] = temp; } } public void setFav(int q, boolean b){ questions[q].favorite = b; } public boolean getFav(int q){ return questions[q].favorite; } 

这可能是一切与我的问题有关。 如果我遗漏了任何东西或者没有任何意义,我很抱歉。 随意问的问题。 我现在还处在改变一切的工作中,所以我可能会复制一些不太合理的东西。

编辑:我还将添加“最喜欢的”button点击代码变成不喜欢,反之亦然。 尽pipe这项工作至关重要,但这并不是我担心正常工作的原因,因为它非常简单。 但是,如果有人觉得他们想看到它,反过来帮助我,那么就是这样。

这也是Java文件的练习题:

 public void setFavoriteButton(){ if(global.getFav(tempQQ)){ FAVORITE.setBackgroundColor(Color.YELLOW); } else{ FAVORITE.setBackgroundColor(getResources().getColor(R.color.primary)); } } @Override public void onClick(View v){ switch(v.getId()){ case R.id.favorite: updateFavorite(); break; } } public void updateFavorite(){ if(global.getFav(tempQQ)){ global.setFav(tempQQ, false); } else{ global.setFav(tempQQ, true); } setFavoriteButton(); } 

编辑:我可能应该补充说,我相信这个问题是algorithm。 如果我没有把“随机化”function与最喜欢的function结合在一起,我想我会好的。 但是我认为这对我的应用程序非常有用非常重要。 所以这就是我关注的焦点,试图在每次调用Global的同时保持随机化的同时实现collections夹function。

Solutions Collecting From Web of "在随机问题列表中创build一个“最喜爱的”function"

我真的build议你使用更多的面向对象的方法来处理你的模型。

您可以创build模型类Quiz ,这可能看起来像这样:

 class Quiz{ private boolean favorite; private String question; private String answer; public Quiz(String question, String answer){ this.question = question; this.answer = answer; } public boolean isFavorite() { return favorite; } public void setFavorite(boolean favorite) { this.favorite = favorite; } //... } 

通过这种方式,您可以创build一个Quiz列表,并进行随机播放,sorting,检查collections夹等等:

  //Create the list of questions ArrayList<Quiz> myQuiz = new ArrayList<Quiz>(); myQuiz.add(new Quiz("Question?", "Ansewer!")); //... //Shuffle all! Collections.shuffle(myQuiz); //Iterate and check for favorites for(Quiz q : myQuiz){ if(q.isFavorite()){ //this is favorite! } } 

关于数据的持久性,您可以考虑使用SQLite方法,或者简单地序列化您的列表并将其保存在SharedPreference

因为我相信你正在将你的collections夹状态存储在你的questionStruct类中,所以你不需要在你的onResume()恢复你的collections夹状态,你可以把它保存在onCreate()

正如@bonnyz所回答的,你可以使用Collections.shuffle(myQuiz);onResume()洗牌,并使用notifyDataSetChanged()刷新适配器。