'Passing ArrayList from Fragment to Fragment throws Exception

I am currently trying to pass an ArrayList from one Fragment to another Fragment, but i'm getting the following error:

error:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.os.Bundle.getSerializable(java.lang.String)' on a null object reference at com.example.quests.onCreateView(QuestsFragment_Aktive.java:30)

I am sending the ArrayList like this:

Bundle bundle = new Bundle();
bundle.putSerializable("key", questListActive);

And receiving it like this:

ArrayList<Quest> questListAktive = (ArrayList<Quest>)getArguments().getSerializable("key");

sending_fragment: QuestsFragment_Offene.java


import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class QuestsFragment_Offene extends Fragment implements Serializable {

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

        View view = inflater.inflate(R.layout.fragment_quests__offene, container, false);
        //myFragment = inflater.inflate(R.layout.fragment_quests, container, false);
        //listView = (ListView) myFragment.findViewById(R.id.questlistView);


        ArrayList<Quest> questListOpen = new ArrayList<>();
        ArrayList<Quest> questListActive = new ArrayList<>();
        questListActive.add(new Quest(0, "empty", 5, false, true, false));

        
        //adding quests
        Quest ch1 = new Quest(1, "Gehe eine Runde um den Block.", 1);
        Quest ch2 = new Quest(2, "Wähle einen Tag in der Woche aus und spaziere zu einem Ort, an dem du schon länger mal sein wolltest.", 2);
        Quest ch3 = new Quest(3, "Führe eine zweiminütige Trainingseinheit durch. (Liegestütze) ", 3);
        Quest ch4 = new Quest(4, "Lass dein Auto am nächsten Arbeitstag stehen und fahre mit dem Fahrrad.", 4);
        Quest ch5 = new Quest(5, "Höre ein Lieblingslied und tanze bis zum Ende des Lieds dazu.", 5);
        Quest ch6 = new Quest(6, "Erledige deinen nächsten kleinen Einkauf zu Fuß oder mit dem Fahrrad, statt mit dem Auto zu fahren.", 6);
        Quest ch7 = new Quest(7, "Führe eine fünfminütige Trainingseinheit durch. (Sit-ups)", 7);
        Quest ch8 = new Quest(8, "Probiere Geocaching aus.", 8);
        Quest ch9 = new Quest(9, "Suche deinen nächsten Park auf und laufe eine Runde.", 9);
        Quest ch10 = new Quest(10, "Verabrede dich zu einer sportlichen Aktivität, die du schon länger aufschiebst. (Schwimmen, Schlittschuhlaufen, Klettern etc.)", 10);
        questListOpen.add(ch1);
        questListOpen.add(ch2);
        questListOpen.add(ch3);
        questListOpen.add(ch4);
        questListOpen.add(ch5);
        questListOpen.add(ch6);
        questListOpen.add(ch7);
        questListOpen.add(ch8);
        questListOpen.add(ch9);
        questListOpen.add(ch10);

        
        
        ArrayAdapter<Quest> arrayAdapter = new ArrayAdapter<Quest>(
                getContext(),
                android.R.layout.simple_list_item_1,
                questListOpen //questList
        );
        //listView.setAdapter(arrayAdapter);

        ListView lvarraylist = (ListView) view.findViewById(R.id.questlistView);
        lvarraylist.setAdapter(arrayAdapter);

        
        //when clicked on a single quest, a popup opens with quest text and 2 buttons "accept" and "decline"
        lvarraylist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                System.out.println(++i);
                int questid = --i;
                //openQuestDetail(++i);

                //opening the popup
                final Dialog fbDialogue = new Dialog(getContext(), android.R.style.Theme_Black_NoTitleBar);
                fbDialogue.getWindow().setBackgroundDrawable(new ColorDrawable(Color.argb(100, 0, 0, 0)));
                fbDialogue.setContentView(R.layout.popup_window);
                fbDialogue.setCancelable(true);
                TextView textViewToChange = (TextView) fbDialogue.findViewById(R.id.questdetailpopup);
                textViewToChange.setText(questListOpen.get(questid).getQuest().toString());
                fbDialogue.show();

                //when clicked on "accept" button, the clicked quest should be removed from the first arraylist
                //and moved to the second fragment "aktive" to be shown there
                fbDialogue.findViewById(R.id.questaccept).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        
                        questListOpen.get(questid).setAktiv(true);
                        questListOpen.get(questid).setOffen(false);
                        questListActive.add(questListOpen.get(questid));
                        questListOpen.remove(questid);
                        lvarraylist.invalidateViews();
                        
                        Bundle bundle = new Bundle();
                        bundle.putSerializable("key", questListActive);
                        
                        //hiding popup
                        fbDialogue.hide();
                    }
                });

                //closing the popup when "close" button inside the popup is clicked 
                fbDialogue.findViewById(R.id.popupclose).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        fbDialogue.hide();
                    }
                });
            }
        });
        return view;
    }
    
    void openQuestdetail(Integer questId) {
        //finish();
        //startActivity(new Intent(QuestListActivity.this, QuestDetailActivity.class));
    }
}

receiving_fragment QuestsFragment_Aktive.java

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.io.Serializable;
import java.util.ArrayList;


public class QuestsFragment_Aktive extends Fragment implements Serializable {

    ArrayList<Quest> questListAktive = new ArrayList<>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

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

        questListAktive.add(new Quest(1,"test",1, false, true, false));
        questListAktive.clear();
        ArrayList<Quest> questListAktive = (ArrayList<Quest>)getArguments().getSerializable("key");

        ArrayAdapter<Quest> arrayAdapter = new ArrayAdapter<Quest>(
                getContext(),
                android.R.layout.simple_list_item_1,
                questListAktive //questList
        );
        //listView.setAdapter(arrayAdapter);

        ListView lvarraylist = (ListView) view.findViewById(R.id.questlistAktiveView);
        lvarraylist.setAdapter(arrayAdapter);


        return view;
    }
}

Thank you very much for your time and help!

Screenshots of what i am trying to accomplish:

1. first fragment with ArrayList "Open"

2. popup of element, when clicking "Annehmen" ArrayList item should be passed to second fragment "Aktive"

3. second fragment "Aktive"

Code-Update after MustafaKhaled's reply:

sending_fragment

import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class QuestsFragment_Offene extends Fragment implements Serializable {

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

        View view = inflater.inflate(R.layout.fragment_quests__offene, container, false);
        //myFragment = inflater.inflate(R.layout.fragment_quests, container, false);
        //listView = (ListView) myFragment.findViewById(R.id.questlistView);


        ArrayList<Quest> questListOpen = new ArrayList<>();
        ArrayList<Quest> questListActive = new ArrayList<>();
        questListActive.add(new Quest(0, "empty", 5, false, true, false));


        //adding quests
        Quest ch1 = new Quest(1, "Gehe eine Runde um den Block.", 1);
        Quest ch2 = new Quest(2, "Wähle einen Tag in der Woche aus und spaziere zu einem Ort, an dem du schon länger mal sein wolltest.", 2);
        Quest ch3 = new Quest(3, "Führe eine zweiminütige Trainingseinheit durch. (Liegestütze) ", 3);
        Quest ch4 = new Quest(4, "Lass dein Auto am nächsten Arbeitstag stehen und fahre mit dem Fahrrad.", 4);
        Quest ch5 = new Quest(5, "Höre ein Lieblingslied und tanze bis zum Ende des Lieds dazu.", 5);
        Quest ch6 = new Quest(6, "Erledige deinen nächsten kleinen Einkauf zu Fuß oder mit dem Fahrrad, statt mit dem Auto zu fahren.", 6);
        Quest ch7 = new Quest(7, "Führe eine fünfminütige Trainingseinheit durch. (Sit-ups)", 7);
        Quest ch8 = new Quest(8, "Probiere Geocaching aus.", 8);
        Quest ch9 = new Quest(9, "Suche deinen nächsten Park auf und laufe eine Runde.", 9);
        Quest ch10 = new Quest(10, "Verabrede dich zu einer sportlichen Aktivität, die du schon länger aufschiebst. (Schwimmen, Schlittschuhlaufen, Klettern etc.)", 10);
        questListOpen.add(ch1);
        questListOpen.add(ch2);
        questListOpen.add(ch3);
        questListOpen.add(ch4);
        questListOpen.add(ch5);
        questListOpen.add(ch6);
        questListOpen.add(ch7);
        questListOpen.add(ch8);
        questListOpen.add(ch9);
        questListOpen.add(ch10);



        ArrayAdapter<Quest> arrayAdapter = new ArrayAdapter<Quest>(
                getContext(),
                android.R.layout.simple_list_item_1,
                questListOpen //questList
        );
        //listView.setAdapter(arrayAdapter);

        ListView lvarraylist = (ListView) view.findViewById(R.id.questlistView);
        lvarraylist.setAdapter(arrayAdapter);


        //when clicked on a single quest, a popup opens with quest text and 2 buttons "accept" and "decline"
        lvarraylist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                System.out.println(++i);
                int questid = --i;
                //openQuestDetail(++i);

                //opening the popup
                final Dialog fbDialogue = new Dialog(getContext(), android.R.style.Theme_Black_NoTitleBar);
                fbDialogue.getWindow().setBackgroundDrawable(new ColorDrawable(Color.argb(100, 0, 0, 0)));
                fbDialogue.setContentView(R.layout.popup_window);
                fbDialogue.setCancelable(true);
                TextView textViewToChange = (TextView) fbDialogue.findViewById(R.id.questdetailpopup);
                textViewToChange.setText(questListOpen.get(questid).getQuest().toString());
                fbDialogue.show();

                //when clicked on "accept" button, the clicked quest should be removed from the first arraylist
                //and moved to the second fragment "aktive" to be shown there
                fbDialogue.findViewById(R.id.questaccept).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        questListOpen.get(questid).setAktiv(true);
                        questListOpen.get(questid).setOffen(false);
                        questListActive.add(questListOpen.get(questid));
                        questListOpen.remove(questid);
                        lvarraylist.invalidateViews();

                        Bundle bundle = new Bundle();
                        bundle.putParcelableArrayList("key", questListActive);

                        //bundle.putSerializable("key", questListActive);

                        //hiding popup
                        fbDialogue.hide();
                        System.out.println("bundle send: " + bundle.toString());
                    }
                });

                //closing the popup when "close" button inside the popup is clicked
                fbDialogue.findViewById(R.id.popupclose).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        fbDialogue.hide();
                    }
                });
            }
        });
        return view;
    }

receiving_fragment

public class QuestsFragment_Aktive extends Fragment implements Serializable {

    ArrayList<Quest> questListAktive = new ArrayList<>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

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

        questListAktive.add(new Quest(1,"test",1, false, true, false));
        questListAktive.clear();
        //ArrayList<Quest> questListAktive = (ArrayList<Quest>)getArguments().getSerializable("key");
        Bundle bundle = new Bundle();
        //bundle.getParcelableArrayList("key");

        //System.out.println("recv bundle: " + bundle);
        //questListAktive.add(bundle);
        ArrayList<Quest> transfer = new ArrayList<>();

        //transfer.add(new Quest(1,"test", 1, false, true, false));
        //transfer.addAll(bundle.getParcelableArrayList("key"));
        //questListAktive.addAll(transfer);
        System.out.println("bundle recv: " + bundle.toString());

        ArrayAdapter<Quest> arrayAdapter = new ArrayAdapter<Quest>(
                getContext(),
                android.R.layout.simple_list_item_1,
                questListAktive //questList
        );
        //listView.setAdapter(arrayAdapter);

        ListView lvarraylist = (ListView) view.findViewById(R.id.questlistAktiveView);
        lvarraylist.setAdapter(arrayAdapter);

        return view;
    }


Solution 1:[1]

You should use the proper serialization funtion.

First: You have to implement Parcelable to Quest.java model class.

for example:

public class Quest implements Parcelable

that will implement some overrided funtions.

Second: You have to use

bundle.putParcelableArrayList("key", questListActive);

Third: You can receive the bundle by

getArguments.getParcelableArrayList<Quest>("key");

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 MustafaKhaled