在随机化的问题列表上创建"收藏"功能

lil*_*win 22 java android

我很难为我的应用正确实现"收藏夹"功能.在对象列表中移动,用户应该能够检查/取消选中某些内容作为收藏.一旦活动进入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();
    }

}
Run Code Online (Sandbox Code Playgroud)

练习Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();
    selectedSection = intent.getStringExtra(chooseSection.chosenSection);

    global = Global.getInstance(selectedSection);

}
Run Code Online (Sandbox Code Playgroud)

全球课程

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;
}
Run Code Online (Sandbox Code Playgroud)

那可能是与我的问题相关的一切.如果我遗漏任何东西或者某些事情没有意义,我道歉.随意问的问题.我现在仍然在改变一切以使其工作,所以我可能已经复制了一些不太合适的东西.

编辑:我还将添加"收藏"按钮的代码单击以将喜爱转变为非喜欢的,反之亦然.尽管掌握这项工作至关重要,但我并不担心这种情况会正常运作,因为它非常简单.但是,如果有人觉得他们想要看到它,反过来帮助我,那么就是这样.

这也是在Practice Questions 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();
}
Run Code Online (Sandbox Code Playgroud)

编辑:我可能应该补充一点,我认为问题是算法.如果我没有将"随机化"功能与收藏夹结合使用,我认为我会没事的.但我认为两者对于我的应用程序非常有用非常重要.这就是我的重点所在,尝试同时实现收藏夹功能,同时在每次调用Global时保持随机化.

bon*_*nyz 15

我真的建议你使用更面向对象的方法来处理你的模型.

您可以创建模型类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;
    }

    //... 
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以创建一个列表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!
       }
    }
Run Code Online (Sandbox Code Playgroud)

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