【问题标题】:parse arraylist form one fragment to another fragment in android在android中将arraylist从一个片段解析到另一个片段
【发布时间】:2018-08-10 07:21:27
【问题描述】:

如何将 JSON 的 Arraylist 从一个 Fragment 解析到另一个 Fragment 这是我的 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;
}

【问题讨论】:

  • 你为你的 ListOffers 类实现了 Parcelable 吗?
  • 不,我没有实现它
  • 所以在你的 ListOffers 类中实现 Parcelable 就不会出现异常了。

标签: android android-fragments arraylist


【解决方案1】:

一个可能的问题:

您的 ListOffers 模型没有实现 parcelable。你的模型应该实现 parcelable。您可以从此链接获得帮助

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

【讨论】:

  • 我的模型是:public ListOffers(int Id){ this.Id = Id; } public void setId(int id) { Id = id; } public int getId() { 返回 ID; }
  • @ansarabbas 使用您的模型代码更新您的问题。
  • 我还将我的模型填充到 arraylist 交易。设置我更新的问题
  • @ansarabbas 使用您的模型 ListOffers 更新您的问题
【解决方案2】:

使用hashmap可以通过

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

并使用以下代码获取它

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

【讨论】:

    【解决方案3】:

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

    参考

    Help passing an ArrayList of Objects to a new Activity

    【讨论】:

      【解决方案4】:

      使用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");
      }
      

      希望对你有帮助:)

      【讨论】:

        【解决方案5】:

        这是一种更简单的方法。

        大多数时候,人们想要发送这些数据是因为他们希望在新类中短时间访问它。不要每次都发送数据,而是转到包含数据的片段并将其公开和静态。

        public static ArrayList<ListOffers> deals;
        

        在您想要的活动中访问它

        MainFragment.deals
        

        【讨论】:

          【解决方案6】:

          让你的 ListOffer 实现 Serializable 然后使用

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-14
            • 1970-01-01
            • 1970-01-01
            • 2017-03-25
            • 2016-09-30
            相关资源
            最近更新 更多