将数据从MainActivity传递到片段
问题描述:
我试图从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中)“对空对象引用
答
是的,你得到这个错误。为什么?因为你有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
答
您可以通过其他方式实现此目的。 从活动中获取数据。
在你的主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();
}
TNX,我做的一切就像你说的,但片段onCreateView函数返回rootView,所以我要适配器设置为它(因为RecyclerView的.setAdapter(适配器)在空对象引用上)。如果在创建片段时没有完整的适配器,我应该设置什么适配器?我想我应该设置一个空的适配器,但是如果这个片段只接受我自定义的RVAdapter,我该怎么做。 – user6549162