在Android中将arraylist解析为一个片段到另一个片段

时间:2018-08-10 07:21:28

标签: android android-fragments arraylist

我如何将JSON的Arraylist从一个片段解析为另一个片段,这是我的arraylist代码,我将从模型中获取arraylist:

private void setListOffers(JSONArray categoryArray) {
    for (int i = 0; i < categoryArray.length(); i++) {
        try {
            JSONObject object = categoryArray.getJSONObject(i);
            hotDealID = object.getInt("ID");
            deals.add(new ListOffers(hotDealID));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

我在这里从碎片中发送数据:

private ArrayList<ListOffers> deals = new ArrayList<>();
Fragment fragment = new HotDealFragment();
Bundle  bundle = new Bundle();
bundle.putParcelableArrayList("dealsId", deals);
fragment.setArguments(bundle);

当我放置这段代码时,交易产生了例外,即错误的第二个参数,而ListOffers是我在其中获取数据的模型

这是我的型号列表优惠:

private int Id;

public ListOffers(int Id){
    this.Id = Id;
}

public void setId(int id) {
    Id = id;
}

public int getId() {
    return Id;
}

6 个答案:

答案 0 :(得分:1)

一个可能的问题:

您的ListOffers模型未实现可打包。您的模型应实现可分割的。您可以从此链接获得帮助

https://github.com/codepath/android_guides/wiki/Using-Parcelable

import android.os.Parcel;
import android.os.Parcelable;

public class ListOffers implements Parcelable {

private int Id;

public ListOffers(int Id) {
    this.Id = Id;
}

public void setId(int id) {
    Id = id;
}

public int getId() {
    return Id;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(Id);
}

protected ListOffers(Parcel in) {

    Id = in.readInt();
}

public static final Creator<ListOffers> CREATOR = new Creator<ListOffers>() {

    @Override
    public ListOffers createFromParcel(Parcel in) {

        return new ListOffers(in);
    }

    @Override
    public ListOffers[] newArray(int size) {

        return new ListOffers[size];
    }
};
}

答案 1 :(得分:1)

使用您可以传递的哈希图

HashMap <String,ArrayList<ListOffers>> hashMap;
Bundle extras = new Bundle();
extras.putSerializable("HashMap",hashMap);
intent.putExtras(extras);

并使用下面的代码获取它

Intent intent = getIntent();    
hasMap= intent.getSerializableExtra("hashMap");

答案 2 :(得分:0)

您的数据模型ListOffers应该实现Parcelable,然后只有您才能作为ParcelableArrayList传递。

参考

Help passing an ArrayList of Objects to a new Activity

答案 3 :(得分:0)

使用Parcelable,您的模型将是

public class ListOffers implements Parcelable {

    private int Id;

    /**
     * Constructs a Model from a Parcel
     *
     * @param parcel Source Parcel
     */
    public ListOffers(Parcel parcel) {
        this.Id = parcel.readInt();
    }

    public ListOffers(int Id) {
        this.Id = Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public int getId() {
        return Id;
    }

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(Id);
    }

    // Method to recreate a Model from a Parcel
    public static Creator<ListOffers> CREATOR = new Creator<ListOffers>() {

        @Override
        public ListOffers createFromParcel(Parcel source) {
            return new ListOffers(source);
        }

        @Override
        public ListOffers[] newArray(int size) {
            return new ListOffers[size];
        }

    };
}

ParcelableArrayList从一个片段发送到另一个-

private ArrayList<ListOffers> deals = new ArrayList<>();
setListOffers(categoryArray);
Fragment fragment = new HotDealFragment();
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("dealsId", deals);
fragment.setArguments(bundle);

将其提取到Fragment-

中的其他onCreate
ArrayList<ListOffers> deals = new ArrayList<>();
if (getArguments() != null) {
    deals = getArguments().getParcelableArrayList("dealsId");
}

希望这会对您有所帮助:)

答案 4 :(得分:0)

这是一种更简单的方法。

大多数情况下,您希望发送此数据的原因是他们希望短时间内在新类中对其进行访问。与其每次都发送数据,不如转到包含数据的片段并将其公开和静态化。

public static ArrayList<ListOffers> deals;

在所需的活动中访问它

MainFragment.deals

答案 5 :(得分:0)

使您的ListOffer实现可序列化,然后使用

private ArrayList<ListOffers> deals = new ArrayList<>();
Fragment fragment = new HotDealFragment();
    Bundle  bundle = new Bundle();
    bundle.putSerializable("dealsId", deals);
    fragment.setArguments(bundle);

这是如何获取

if (getArguments() != null)  {
       mdealsId = (ListOffers)getArguments().getSerializable("dealsId");
 }