Создание "любимой" функции в списке вопросов, которые рандомизируются
Мне нелегко правильно реализовать функцию "избранное" для моего приложения. Переходя через список объектов, пользователь должен иметь возможность проверять/снимать с экрана что-то в качестве избранного. После того, как действие переместится в состояние onPause();
, оно должно сохранить список избранных (скорее, полный список логических маркеров, которые сигнализируют, является ли что-то любимым или нет... true
для избранного, false
для не любимый.) Очевидно, что при переходе в состояние onResume();
список должен быть загружен, чтобы они могли просматривать избранные, которые они ранее отмечали.
Моя проблема, я думаю, действительно исходит из того, что список рандомизирован при инициализации. Я уверен, что мой алгоритм выключен, но я пробовал различные способы до такой степени, что я едва ли мог бы смотреть на него больше.
Основная деятельность 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);
}
Глобальный класс
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 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 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;
}
Это должно быть все, что уместно для моих проблем. Прошу прощения, если я что-то упустил или что-то не имеет смысла. Не стесняйтесь задавать вопросы. Я все еще в настоящее время находится в середине изменения всего, чтобы заставить его работать, поэтому я мог бы скопировать что-то, что совсем не складывается.
EDIT: я также добавлю код для "любимой" кнопки, чтобы превратить любимую в не-любимую и наоборот. Несмотря на то, что это важно для этой работы, я не беспокоился о том, чтобы нормально работать, потому что это так просто. Но, если кто-то чувствует, что они хотели бы это увидеть, и, в свою очередь, помогите мне, тогда вот оно.
Это также находится в файле Java Practice Questions:
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();
}
EDIT: я мог бы добавить, что я считаю, что проблема алгоритмическая. Если бы у меня не было возможности "рандомизировать" в сочетании с фаворитами, я был бы в порядке, я думаю. Но я думаю, что для моего приложения важно, чтобы это было очень полезно. Таким образом, когда я сосредоточен на том, чтобы попытаться реализовать функцию избранного одновременно, сохраняя рандомизацию каждый раз, когда вызывается Global.
Ответы
Ответ 1
Я действительно предлагаю вам использовать более объектно-ориентированный подход для обработки вашей модели.
Вы можете создать класс модели 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;
}
//...
}
Таким образом, вы можете создать список Quiz
и выполнить перетасовку, упорядочивание, проверку избранного и т.д.:
//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
.
Ответ 2
Как я полагаю, вы сохраняете состояние избранного в своем классе questionStruct
, вам не нужно восстанавливать состояние избранного в onResume()
, вы можете сохранить его в onCreate()
.
Как ответил @bonnyz, вы можете использовать Collections.shuffle(myQuiz);
для перетасовки своих элементов в onResume()
и обновления вашего адаптера с помощью notifyDataSetChanged()
.