2016-11-20 121 views
0

我試圖從onDataLoaded函數(它在MainActivity中)傳遞自定義對象的列表片段,使用Parcelable。但我得到這個錯誤...將數據從MainActivity傳遞到片段

這是一個MainActivity funkcion,onDataLoaded

這是片段:

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); 
} 

} 

這是對象類

@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]; 
    } 
}; 

} 

我不明白爲什麼我會得到空指針異常

試圖調用虛擬方法android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String中)「對空對象引用

回答

0

是的,你得到這個錯誤。爲什麼?因爲你有2個錯誤:

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

- >你試圖讓你的Activity,不是你的碎片包。您應該嘗試使用。

你會得到另一個錯誤,因爲當你的片段的onCreateView()被調用時,你的片段沒有參數包(你的包在你的activity中設置爲onDataLoaded)。正如我的意見,你應該在你的片段重新加載數據,如:

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

TNX,我做的一切就像你說的,但片段onCreateView函數返回rootView,所以我要適配器設置爲它(因爲RecyclerView的.setAdapter(適配器)在空對象引用上)。如果在創建片段時沒有完整的適配器,我應該設置什麼適配器?我想我應該設置一個空的適配器,但是如果這個片段只接受我自定義的RVAdapter,我該怎麼做。 – user6549162

0

您可以通過其他方式實現此目的。 從活動中獲取數據。

在你的主java中添加updateListInFragment()。 MainActivity.java

public ArrayList<Ponuda> updateListInFragment(){ 
     return ponudaArrayList; 
    } 

SvePonudeFragment.java

private ArrayList<Ponuda> mMyList; 
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(); 
    updateArrayList(); //Let's update here 


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

    initializeAdapter(listaPonuda); 

    return rootView; 
    } 



// Update your mMyList from activity 
public void updateArrayList(){ 

    MainActivity activity = (MainActivity) activity; 
    mMyList = activity.updateListInFragment(); 

} 
相關問題