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