Android

how to properly implement Parcelable with an ArrayList?

как правильно реализовать Parcelable с помощью ArrayList?

У меня возникли проблемы с созданием моего класса Parcelable. Проблема в том, что я пытаюсь записать в parcel член класса, который является ArrayList<Parcelable> объектом. ArrayList Есть Serializable, а объекты (ZigBeeDev) в списке есть Parcelable.

Вот соответствующий код:

package com.gnychis.coexisyst;

import java.util.ArrayList;
import java.util.Iterator;

import android.os.Parcel;
import android.os.Parcelable;

public class ZigBeeNetwork implements Parcelable {

public String _mac; // the source address (of the coordinator?)
public String _pan; // the network address
public int _band; // the channel
ArrayList<Integer> _lqis; // link quality indicators (to all devices?)
ArrayList<ZigBeeDev> _devices; // the devices in the network

public void writeToParcel(Parcel out, int flags) {
out.writeString(_mac);
out.writeString(_pan);
out.writeInt(_band);
out.writeSerializable(_lqis);
out.writeParcelable(_devices, 0); // help here
}

private ZigBeeNetwork(Parcel in) {
_mac = in.readString();
_pan = in.readString();
_band = in.readInt();
_lqis = (ArrayList<Integer>) in.readSerializable();
_devices = in.readParcelable(ZigBeeDev.class.getClassLoader()); // help here
}

public int describeContents() {
return this.hashCode();
}

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

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

//...
}

Я отметил два места "// help here", чтобы понять, как правильно выполнять запись в parclet и как ее реконструировать. Если ZigBeeDev is Parcelable (правильно протестировано), как мне это правильно сделать?

Переведено автоматически
Ответ 1

У вас почти получилось!

Вам просто нужно сделать :

public void writeToParcel(Parcel out, int flags) {
out.writeString(_mac);
out.writeString(_pan);
out.writeInt(_band);
out.writeSerializable(_lqis);
out.writeTypedList(_devices);
}

private ZigBeeNetwork(Parcel in) {
_mac = in.readString();
_pan = in.readString();
_band = in.readInt();
_lqis = (ArrayList<Integer>) in.readSerializable();
in.readTypedList(_devices, ZigBeeDev.CREATOR);
}

Вот и все!

Для вашего списка целых чисел вы также можете сделать :

out.writeList(_lqis);
_lqis = new ArrayList<>();
in.readList(_lqis Integer.class.getClassLoader());

Это должно сработать.

Ответ 2

В моем случае in.readTypedList(_devices, ZigBeeDev.CREATOR); дал мне NullPointerException on _devices. Поэтому я использовал это:

_devices = in.createTypedArrayList(ZigBeeDev.CREATOR);
Ответ 3

Вы должны использовать writeList(список l) для вашего списка целых чисел и writeTypedList(список значений) для списка ZigBeeDevices

Ответ 4

В конструкторе вы должны использовать

_lqis = in.createTypedArrayList(ZigBeeDev.CREATOR);

И в "writeToParcel" использовать

out.writeTypedList(_lqis);
2023-05-20 03:21 java android