Search code examples
javaandroidandroid-fragmentsparcelable

Passing data from MainActivity to Fragment


I'm trying to pass list of custom object from onDataLoaded function (which is in MainActivity) to fragment, using Parcelable. But I get this error...

This is a MainActivity funkcion, onDataLoaded

@Override
public void onDataLoaded(List<Grad> gradovi, List<Ponuda> ponude) {

    Spinner spinnerGradovi = (Spinner) findViewById(R.id.gradovi_spinner);
    ArrayAdapter<String> adapterGradovi;
    List<String> listaGradova = new ArrayList<>();
    ArrayList<Ponuda> ponudaArrayList = new ArrayList<Ponuda>();

    ponudaLista = ponude;
    gradLista = gradovi;

    for(Grad grad : gradovi ){
        listaGradova.add(grad.getNaziv());
    }

    for(Ponuda ponuda : ponude){
        ponudaArrayList.add(ponuda);
    }


    //here I want to get arguments which contains ArrayList
    Fragment fragmentGet = svePonudeFragment;
    Bundle bundle = new Bundle();
    bundle.putParcelableArrayList("Ponuda", ponudaArrayList);
    fragmentGet.setArguments(bundle);


    adapterGradovi = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, listaGradova);

    spinnerGradovi.setAdapter(adapterGradovi);


}

And this is Fragment:

public class SvePonudeFragment extends Fragment {

private RecyclerView rv;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.sve_ponude_fragment, container, false);

    rv = (RecyclerView) rootView.findViewById(R.id.rv);
    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    rv.setLayoutManager(llm);

    Bundle data = getActivity().getIntent().getExtras();
    ArrayList<Ponuda> listaPonuda= data.getParcelable("ponude");


    for(Ponuda ponuda : listaPonuda){
        System.out.println(ponuda.getNaziv());
    }

    initializeAdapter(listaPonuda);

    return rootView;
}

private void initializeAdapter(List<Ponuda> preuzetePonude){
    RVAdapter adapter = new RVAdapter(preuzetePonude);
    rv.setAdapter(adapter);
}

}

This is object class

@Table(database = MainDatabase.class)
public class Ponuda extends BaseModel implements Parcelable{

@Column
@PrimaryKey int id;
@Column  String tekstPonude;
@Column  int cijena;
@Column  int popust;
@Column  int cijenaOriginal;
@Column  String urlSlike;
@Column  int usteda;
@Column  String kategorija;
@Column  String grad;
@Column  String datumPonude;

public Ponuda() {
}

public Ponuda(int id,String tekstPonude, int cijena, int popust, int cijenaOriginal, String urlSlike, int usteda, String kategorija, String grad, String datumPonude){
    this.id=id;
    this.tekstPonude = tekstPonude;
    this.cijena = cijena;
    this.popust = popust;
    this.cijenaOriginal = cijenaOriginal;
    this.urlSlike = urlSlike;
    this.usteda = usteda;
    this.kategorija = kategorija;
    this.grad = grad;
    this.datumPonude = datumPonude;
}

public String getNaziv() {
    return tekstPonude;
}
public String getCijena() {
    return Integer.toString(cijena);
}
public String getURL() {
    return urlSlike;
}

public void setCijena(int cijena) {
    this.cijena = cijena;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getTekstPonude() {
    return tekstPonude;
}

public void setTekstPonude(String tekstPonude) {
    this.tekstPonude = tekstPonude;
}

public int getPopust() {
    return popust;
}

public void setPopust(int popust) {
    this.popust = popust;
}

public int getCijenaOriginal() {
    return cijenaOriginal;
}

public void setCijenaOriginal(int cijenaOriginal) {
    this.cijenaOriginal = cijenaOriginal;
}

public String getUrlSlike() {
    return urlSlike;
}

public void setUrlSlike(String urlSlike) {
    this.urlSlike = urlSlike;
}

public int getUsteda() {
    return usteda;
}

public void setUsteda(int usteda) {
    this.usteda = usteda;
}

public String getKategorija() {
    return kategorija;
}

public void setKategorija(String kategorija) {
    this.kategorija = kategorija;
}

public String getGrad() {
    return grad;
}

public void setGrad(String grad) {
    this.grad = grad;
}

public String getDatumPonude() {
    return datumPonude;
}

public void setDatumPonude(String datumPonude) {
    this.datumPonude = datumPonude;
}
public static List<Ponuda> getAll(){
    List<Ponuda> ponudaList;
    ponudaList= new Select().from(Ponuda.class).queryList();

    return ponudaList;
}


public Ponuda(Parcel in){
    String[] data = new String[9];

    in.readStringArray(data);
    this.id = in.readInt();
    this.tekstPonude = in.readString();
    this.cijena = in.readInt();
    this.popust = in.readInt();
    this.cijenaOriginal = in.readInt();
    this.urlSlike = in.readString();
    this.usteda = in.readInt();
    this.kategorija = in.readString();
    this.grad = in.readString();
    this.datumPonude = in.readString();

}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeString(tekstPonude);
    dest.writeInt(cijena);
    dest.writeInt(popust);
    dest.writeInt(cijenaOriginal);
    dest.writeString(urlSlike);
    dest.writeInt(usteda);
    dest.writeString(kategorija);
    dest.writeString(grad);
    dest.writeString(datumPonude);
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public Ponuda createFromParcel(Parcel in) {
        return new Ponuda(in);
    }

    public Ponuda[] newArray(int size) {
        return new Ponuda[size];
    }
};

}

I don't understand why I get null pointer exception

Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference


Solution

  • Yes, you got this error. Why? because you have 2 errors:

    Bundle data = getActivity().getIntent().getExtras(); 
    

    -> you are trying to get bundle of your Activity, not your fragment. You should try to use getArguments() instead.

    You will get another error because when your fragment's onCreateView() is called, there's no argument bundle in your fragment (your bundle is set in onDataLoaded from your activity). As my opinion you should make a reload data in your fragment like:

    public void reloadData(){
          //getArguments, parse and show in the list 
    }
    //then in your onDataLoaded of MainActivity:
    //here I want to get arguments which contains ArrayList
    ((YourFragment)fragmentGet).reloadData(); //call after set argument