Array has data, but returns null when accessed later!

Hey! So, I have a fragment which has a callback that receives the data from a JSON file that I am accessing using retrofit. Everything is working fine, and according to my log and my first run, the data IS being saved in my local arrays, and later I can access that data and display to the user.

However, when I open the fragment again and call a method to display data once again, the arrays that were previously full of data now are null.

Can anyone please enlighten me? I’m stuck!

here’s my code:



public class GameFragment extends Fragment {

    private TextView txtQuestion;
    private Button btnAnswer1;
    private Button btnAnswer2;
    private Button btnAnswer3;
    private Button btnAnswer4;

    private Questions[] gameQuestions;
    private Questions[] animeQuestions;
    private Questions[] techQuestions;
    private Questions[] movieQuestions;
    private Questions[][] gameCategories = new Questions[4][];

    int correctAnswer = -1;


    Callback cb = new Callback<MyApiData>(){

        @Override
        public void success(MyApiData myApiData, Response response) {

            gameCategories[0] = new Questions[myApiData.getCategory()[0].getQuestions(0).length];
            gameCategories[1] = new Questions[myApiData.getCategory()[1].getQuestions(1).length];
            gameCategories[2] = new Questions[myApiData.getCategory()[2].getQuestions(2).length];
            gameCategories[3] = new Questions[myApiData.getCategory()[3].getQuestions(3).length];

            for(int i = 0; i < 4 ; i++){
                for(int j = 0; j < gameCategories[i].length ; j++){
                    gameCategories[i][j] = myApiData.getCategory()[i].getQuestions(i)[j];
                    //Log.d("GameFragment", "gameCategories[i][j] - gameCategories["+i+"]["+j+"]: " + gameCategories[i][j].getQuestion());
                }
            }

        }

        @Override
        public void failure(RetrofitError error) {
            Log.d("GameScreen", "Callback failed!");
        }
    };

    public GameFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_game, container, false);

        txtQuestion = (TextView) view.findViewById(R.id.txtQuestion);

        btnAnswer1 = (Button) view.findViewById(R.id.btnAnswer1);
        btnAnswer2 = (Button) view.findViewById(R.id.btnAnswer2);
        btnAnswer3 = (Button) view.findViewById(R.id.btnAnswer3);
        btnAnswer4 = (Button) view.findViewById(R.id.btnAnswer4);

        btnAnswer1.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View view) { checkAnswer(view); } });
        btnAnswer2.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View view) { checkAnswer(view); } });
        btnAnswer3.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View view) { checkAnswer(view); } });
        btnAnswer4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkAnswer(view);
            }
        });


        RestClient.get().getQuestions(cb);

        // Inflate the layout for this fragment
        return view;
    }


 


    public void checkAnswer(View v){

        switch(v.getId()){
            case R.id.btnAnswer1:
                if(correctAnswer == 1){
                    feedback(true, btnAnswer1);
                }else {
                    feedback(false, btnAnswer1);
                }
                break;
            case R.id.btnAnswer2:
                if(correctAnswer == 2){
                    feedback(true, btnAnswer2);
                }else {
                    feedback(false, btnAnswer2);
                }
                break;
            case R.id.btnAnswer3:
                if(correctAnswer == 3){
                    feedback(true, btnAnswer3);
                }else {
                    feedback(false, btnAnswer3);
                }
                break;
            case R.id.btnAnswer4:
                if(correctAnswer == 4){
                    feedback(true, btnAnswer4);
                }else {
                    feedback(false, btnAnswer4);
                }
                break;
            default: txtQuestion.setText("Error");
                break;
        }
    }

    public void feedback(Boolean correct, Button btn){

        if(correct){
            btn.setBackgroundColor(Color.GREEN);
            btn.setText("CORRECT!");
        }else{
            btn.setBackgroundColor(Color.RED);
            btn.setText("WRONG!");
        }

    }



    public void displayQuestion(){

        Random randomizer = new Random();

        int randomQuestion;
        int category = GTMain.choosenCategory;

        if(category == 5){
            category = randomizer.nextInt(4);
        }

        randomQuestion = randomizer.nextInt(25);

        Log.d("displayQuestion", "Before if statements");

        if(gameCategories != null && gameCategories.length != 0) {
            Log.d("displayQuestion", "First if");
            if(gameCategories[category] != null && gameCategories[category].length != 0){
                Log.d("displayQuestion", "Second if");

                txtQuestion.setText(gameCategories[category][randomQuestion].getQuestion());
                correctAnswer = gameCategories[category][randomQuestion].getCorrectAnswer();
                //Log.d("displayQuestion()", "correctAnswer: " + correctAnswer);
                btnAnswer1.setText(gameCategories[category][randomQuestion].getAnswers().getA1());
                btnAnswer2.setText(gameCategories[category][randomQuestion].getAnswers().getA2());
                btnAnswer3.setText(gameCategories[category][randomQuestion].getAnswers().getA3());
                btnAnswer4.setText(gameCategories[category][randomQuestion].getAnswers().getA4());
            }
        }

    }
}

I think your fragment is being recreated every time so all the data is becoming null.

Maybe you could save the data in local prefs after receiving it and pull it when the fragment is being recreated.