• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps Array has data, but returns null when accessed later!

ludens

Lurker
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:

Java:
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>(){

        [USER=1021285]@override[/USER]
        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());
                }
            }
        }

        [USER=1021285]@override[/USER]
        public void failure(RetrofitError error) {
            Log.d("GameScreen", "Callback failed!");
        }
    };

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


    [USER=1021285]@override[/USER]
    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() {
            [USER=1021285]@override[/USER] public void onClick(View view) { checkAnswer(view); } });
        btnAnswer2.setOnClickListener(new View.OnClickListener() {
            [USER=1021285]@override[/USER] public void onClick(View view) { checkAnswer(view); } });
        btnAnswer3.setOnClickListener(new View.OnClickListener() {
            [USER=1021285]@override[/USER] public void onClick(View view) { checkAnswer(view); } });
        btnAnswer4.setOnClickListener(new View.OnClickListener() {
            [USER=1021285]@override[/USER]
            public void onClick(View view) {
                checkAnswer(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());
            }
        }

    }
}
 
Last edited by a moderator:
Hi @ludens and welcome to Android Forums :)

I'm not a developer so I can't help much, but I did go ahead and wrap your code in [code=java]...[/code] tags to make it a bit easier to read. That also helped with an issue where the forum software was interpreting stuff like "gameGategories[I][j]" as an invocation of the Italics BBcode formatting option ("[i]...[/i]"). :thumbsupdroid:
 
Sorry, this is my first time posting here and I did not see the tag for formatting code.

Thanks for the tips and adding the tags though! =]
 
Back
Top Bottom