【问题标题】:intent.putExtra a list of Parcelable objects and enumsintent.putExtra 一个 Parcelable 对象和枚举的列表
【发布时间】:2019-10-25 16:21:12
【问题描述】:

这个问题与所有其他问题不同,因为这里的可打包对象列表是在外部动态创建的,只是在之前通过 Intent 发送它。

问题:产品是可包裹的,但自定义 List<Product> 不是。如何制作ListParcelable??

产品

public class Product implements Parcelable {

    public String id;
    public String name;

    public Product(String id, String name) {
        this.id = id;
        this.name = name;
    }

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

    protected Product(Parcel in) {
        id = in.readString();
        name = in.readString();
    }

    public static final Creator<Product> CREATOR = new Creator<Product>() {
        @Override
        public Product createFromParcel(Parcel in) {
            return new Product(in);
        }

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(id);
        parcel.writeString(name);
    }
}

活动类

Intent intent = new Intent(this, ShowProducts.class);
List<Product> products = getSpecificProducts();

intent.putExtra("PRODUCTS", products); // error

startActivity(intent);

编辑

问题是两个,不是重复的,另一部分是List&lt;Enum&gt;

public enum Department implements Parcelable {

    SALES("Sales", 0),
    HR("HR", 1),

    public String name;
    public int ordinal;

    Department(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }

    public static final Creator<Department> CREATOR = new Creator<Department>() {
        @Override
        public Department createFromParcel(Parcel in) {
            return Department.values()[in.readInt()];
        }

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

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

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

}

根据建议的答案,我已经尝试过了。

List<Department> departments = getSpecificDepartments();

intent.putParcelableArrayListExtra("Departments", departments);

错误:不兼容的类型:List&lt;Department&gt; 无法转换为 ArrayList&lt;? extends Parcelable&gt;

【问题讨论】:

  • 使用 Pojo,您可以尝试将其编码为 JSON,稍后通过 Google 的 Gson 进行解析。
  • @AdmiralKunkka 你确定吗?
  • @GensaGames 您的回答非常正确。我只是提供另一种选择来解决他的问题。是的,任何包含这些对象的普通 java 对象或列表都可以通过 Gson 序列化为 JSON。
  • @AdmiralKunkka 你确定吗?双重序列化为 JSON、Parcelable 然后双重反序列化的另一种选择?

标签: android parcelable


【解决方案1】:

您不需要使 List 可打包。说白了,就是用现有的方法。

final Intent i = new Intent(this,SecondActivity.class);
final ArrayList<Product> list = new ArrayList< Product >();
i.putParcelableArrayListExtra(PRODUCT_KEY, list);
startActivity(i);

以几乎相同的方式检索。

final ArrayList<Product> list = this.getIntent()
            .getParcelableArrayListExtra(PRODUCT_KEY);

更新

回答你的新问题。你不能在里面传递通用的List。因为List 你可以有不同的收藏。要知道系统,使用哪种类型,您需要具有显式类型。

// This will work. 
final ArrayList<Department> departments = getSpecificDepartments();
intent.putParcelableArrayListExtra(DEPARTMENTS_KEY, departments);

【讨论】:

  • 这一行有错误 -> intent.putParcelableArrayListExtra(DEPARTMENTS_KEY, departments);
  • 枚举列表有问题
【解决方案2】:

像这样使用putParcelableArrayListExtra 方法:

ArrayList<Product> products = getSpecificProducts();
intent.putParcelableArrayListExtra("PRODUCTS", products);

【讨论】:

  • 我们几乎同时发帖。我看到了这个问题并回答了。我只是在发布答案之前没有刷新页面。投反对票的家伙是怎么回事?这是一个帮助他人的社区。正确答案的判断是由提出问题的人来判断的,他/她可能会接受您的答案,因为它是较早发布的。你投反对票误导了其他人。
  • 对不起,我走了一点,回到办公桌前,我实际上有这两个问题,请看我的编辑,你的回答是对的,如果你可以添加另一个额外的位,我'真的很感激。
  • 你应该使用 ArrayList 而不是 List。
【解决方案3】:

试试这个

var intent = Intent(this, ActivityB::class.java)
val list = arrayListOf<Person>()
intent.putParcelableArrayListExtra("LIST", list)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多