【问题标题】:Reading ArrayList in Parcelable在 Parcelable 中读取 ArrayList
【发布时间】:2014-06-26 07:56:12
【问题描述】:

我有一个名为 SuperMedia 的类,它实现了 Parcelable。该类的字段之一是 ArrayList 子级。当我创建一个Bundle并尝试将“SuperMedia”对象从一个活动传递到另一个活动时,所有字段都可以正常传递,但ArrayList“children”除外,它每次都显示为空。

在我的第一个活动中:

 Bundle a = new Bundle();
 a.putParcelable("media",media); //media is an object of type "SuperMedia" and all the "children" have been initialized and added to the array
 final Intent i = new Intent("com.tv.video.subcategories");
 i.putExtra("subcategories", a);

在我的第二个活动中:

  Intent i = getIntent();
  Bundle secondBun = i.getBundleExtra("subcategories");
  SuperMedia media = secondBun.getParcelable("media"); //For some reason the ArrayList"children" field shows up as empty. 

我不确定为什么会这样。如果有人能引导我走上正确的道路,将不胜感激。下面是我的 SuperMedia 课程。

public class SuperMedia implements Parcelable{

public URI mthumb;
public String mTitle;
public ArrayList<SuperMedia> children = new ArrayList(); 

public SuperMedia(URI thumb, String title) {
    this.mthumb = thumb;
    this.mTitle = title;
}


@Override
public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    dest.writeString(mTitle);
    dest.writeString(mthumb.toString());
    dest.writeTypedList(children);

}

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

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

private SuperMedia(Parcel in) {
    mTitle = in.readString();
    try {
        mthumb = new URI(in.readString());
    } catch (URISyntaxException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    in.readTypedList(children, SuperMedia.CREATOR);

}

public SuperMedia(){

}

}

【问题讨论】:

  • children 包含SuperMedia 的实例?还是有它的后代?
  • @njzk2 它包含后代
  • 那么它就无法工作,因为 SuperMedia.CREATOR 不知道如何解包这些。
  • 您的代码似乎应该可以工作。我不确定,但尝试将public ArrayList&lt;SuperMedia&gt; children = new ArrayList(); 更改为public List&lt;SuperMedia&gt; children = new ArrayList();
  • @erakitin:这不会改变任何东西,因为 ArrayList 是一个列表。另外,这里的实际问题是SuperMedia implements Parcelable,但这不适用于extends SuperMedia,因为SuperMedia.CREATOR 只能调用new SuperMedia(in)

标签: java android arraylist parcelable


【解决方案1】:

如果你想简单地通过意图传递对象,那么你可以让 SuperMedia Serializable 不需要 Parcelable。

public class SuperMedia implements Serializable{...}

把它当作

Bundle a = new Bundle(); a.putSerializable("media",media);

我们得到它。

Intent i = getIntent();
Bundle secondBun = i.getBundleExtra("subcategories");
SuperMedia media = (SuperMedia)secondBun.getSerializable("media");

如果您真的需要 Parcelable,那么它可能对您有所帮助。 Arraylist in parcelable object

【讨论】:

  • Parcelable 和 Serializable 不做同样的事情吗?我的问题是我的arrayList“孩子”在我通过它后总是在第二个活动中显示为空
  • @Pradeep Parcelable 速度更快,对 IPC 进行了更优化,这也是 android 推荐它的原因。 (人们不只是为了刺激人们的头脑而四处添加新的方法来做同样的事情)
  • @PradeepYaduvanshy :但是,鉴于 Serializable 与 Parcelable 相比更易于使用,在这种情况下,如果 SuperMedia 的后代很多,它可能是一个不错的选择
  • @PradeepYaduvanshy 实现 Serializable 而不是 Parcelable 解决了这个问题。非常感谢您的帮助
【解决方案2】:

使用 Bundle 的 putParcellableArrayList 存储 SuperMedia 对象

Bundle args = new Bundle();
args.putParcelableArrayList("media", "media");

为了恢复

getArguments().getParcelableArrayList("media");

这种方式将确保捆绑保存您的列表对象,如在 parcelable 实例中实现的那样。 另外,请注意仅使用 ArrayList,不支持其他 List 子类。

【讨论】:

  • 它必须是 args.putParcelable 因为媒体是一个对象,而不是一个 ArrayList。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 2020-11-07
相关资源
最近更新 更多