intent.putExtra список Parcelable объектов и перечислений - PullRequest
5 голосов
/ 25 октября 2019

Этот вопрос отличается от всех других вопросов, потому что здесь список объектов, подлежащих продаже, создается на лету, просто отправляя его ранее через Intent.

Проблема: Товар подлежит продаже, а пользовательский List<Product> - нет. Как сделать List Parcelable ??

Продукт

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<Enum>

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<Department> не может быть преобразовано в ArrayList<? extends Parcelable>

Ответы [ 3 ]

2 голосов
/ 25 октября 2019

Используйте putParcelableArrayListExtra метод, подобный этому:

ArrayList<Product> products = getSpecificProducts();
intent.putParcelableArrayListExtra("PRODUCTS", products);
1 голос
/ 25 октября 2019

Вам не нужно делать список подлежащим обработке. Чтобы поставить его, просто используйте существующий метод.

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);
0 голосов
/ 25 октября 2019

Попробуйте это

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