【问题标题】:How to pass a custom object with a 2D ArrayList field using Parcelable如何使用 Parcelable 传递带有 2D ArrayList 字段的自定义对象
【发布时间】:2017-08-16 12:40:55
【问题描述】:

在我的练习课中,我有一个 2D ArrayList。我已经设法使用 Parcelable 将所有字段从 Activity 传递到另一个。但是,我无法弄清楚如何使用 Parcelable 在我的对象中传递 2D ArrayList。

public class Exercise implements Parcelable{
    private String name, equipmentRequired;
    private ArrayList musclesWorked;
    private HashMap personalBest;
    private boolean selected;
    private float minAccelLevel, minAccelChanges;
    private ArrayList<ArrayList<Double>> sets = new ArrayList<>();

    ...

    private Exercise(Parcel in) {
        name = in.readString();
        equipmentRequired = in.readString();
        musclesWorked = in.readArrayList(ArrayList.class.getClassLoader());
        personalBest = in.readHashMap(HashMap.class.getClassLoader());
        selected = in.readInt() != 0;
        // sets = ???????
    }

    public static final Parcelable.Creator<Exercise> CREATOR = newParcelable.Creator<Exercise>() {
        public Exercise createFromParcel(Parcel in) {
            return new Exercise(in);
        }

        public Exercise[] newArray(int size) {
            return new Exercise[size];
        }
    };

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(equipmentRequired);
        dest.writeList(musclesWorked);
        dest.writeMap(personalBest);
        dest.writeInt(selected ? 1 : 0);
        // ?????
    }

}

【问题讨论】:

    标签: java android multidimensional-array parcelable


    【解决方案1】:

    根据Google Documentation 和这个other question,我建议使用

    private Exercise(Parcel in) {
            name = in.readString();
            equipmentRequired = in.readString();
            musclesWorked = in.readArrayList(ArrayList.class.getClassLoader());
            personalBest = in.readHashMap(HashMap.class.getClassLoader());
            selected = in.readInt() != 0;
            sets = in.readArrayList(null);
    }
    

    这是因为,正如文档所述:

    给定的类加载器将用于加载任何封闭的 Parcelables。

    【讨论】:

      【解决方案2】:

      设法自己解决了问题。谢谢。

      ...
      
          private Exercise(Parcel in) {
              ...
              sets = in.readArrayList(ArrayList.class.getClassLoader());
          }
      
      
      
          @Override
          public void writeToParcel(Parcel dest, int flags) {
              ...
              dest.writeList(sets);
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 2014-03-07
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多