Androidプロジェクトがあり、そこにクラスがあります。そのクラスにはArrayList<Choices>
。 XMLを取得して解析し、それからオブジェクトを作成して、別のアクティビティに渡します。このためにParcelableを選択しています。
Parcelableは良い選択ですか?私はすべてを正しくやっていますか? Parcelableにはあまり詳しくありません。私のArrayListは、このクラス内で作成した別のクラスのものです。 Parcelableなどを拡張せずに、オブジェクトのArrayListをParcelに適切に渡しますか?
import Java.util.ArrayList;
import Android.os.Parcel;
import Android.os.Parcelable;
import Android.support.v4.os.ParcelableCompat;
public class Question implements Parcelable{
String id;
String text;
String image;
ArrayList<Choices> CHOICES;
public Question(String id, String text, String image) {
super();
this.id = id;
this.text = text;
this.image = image;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
@Override
public String toString() {
return "Question [id=" + id + ", text=" + text + ", image=" + image
+ "]";
}
// Answer Choices class
class Choices {
boolean isCorrect;
String choice;
public Choices(boolean isCorrect, String choice) {
this.isCorrect = isCorrect;
this.choice = choice;
}
public String getChoice() {
return choice;
}
public boolean getIsCorrect() {
return isCorrect;
}
@Override
public String toString() {
return "Choices [isCorrect=" + isCorrect + ", choice=" + choice
+ "]";
}
}
public static final Parcelable.Creator<Question> CREATOR = new Parcelable.Creator<Question>() {
@Override
public Question createFromParcel(Parcel in) {
return new Question(in);
}
@Override
public Question[] newArray(int size) {
return new Question[size];
}
};
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(text);
dest.writeString(image);
dest.writeList(CHOICES);
}
private Question(Parcel in) {
this.id = in.readString();
this.text = in.readString();
this.image = in.readString();
this.CHOICES = in.readArrayList(Choices.class.getClassLoader());
}
}
助けてくれてありがとう!
アクティビティ間でArrayList
を渡す必要がある場合は、Parcelable
も実装します。他に方法はないと思います。しかし、それほど多くのゲッターとセッターが必要になるとは思わない。 Question
を実装するParcelable
クラスは次のとおりです。
public class Question implements Parcelable {
public String id;
public String text;
public String image;
public ArrayList<Choice> choices;
/**
* Constructs a Question from values
*/
public Question (String id, String text, String image, ArrayList<Choice> choices) {
this.id = id;
this.text = text;
this.image = image;
this.choices = choices;
}
/**
* Constructs a Question from a Parcel
* @param parcel Source Parcel
*/
public Question (Parcel parcel) {
this.id = parcel.readString();
this.text = parcel.readString();
this.image = parcel.readString();
this.choices = parcel.readArrayList(null);
}
@Override
public int describeContents() {
return 0;
}
// Required method to write to Parcel
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(text);
dest.writeString(image);
dest.writeList(choices);
}
// Method to recreate a Question from a Parcel
public static Creator<Question> CREATOR = new Creator<Question>() {
@Override
public Question createFromParcel(Parcel source) {
return new Question(source);
}
@Override
public Question[] newArray(int size) {
return new Question[size];
}
};
}
あなたはそれをほとんど持っていますが、完全ではありません。 Questionクラスは、ほぼ正しくParcelableに見えます。動作しない唯一のことは、選択肢の配列を分割することです。
次の2つの方法があります。
使用する:
_in.createTypedArrayList(Product.CREATOR)
_
Parableオブジェクトをパラメーターとして受け取るコンストラクター内。
WriteToParcelメソッドでdest.writeTypedList(product);
を使用します
「Choices」の新しいJavaファイルを作成し、「Parcelable」を実装します。parcelableを実装しない場合、実行時例外(マーシャリング不可)が発生します。以下のコードを使用します。
public class Choices implements Parcelable{
boolean isCorrect;
String choice;
public Choices(boolean isCorrect, String choice) {
this.isCorrect = isCorrect;
this.choice = choice;
}
//Create getters and setters
protected Choices(Parcel in) {
isCorrect = in.readByte() != 0;
choice = in.readString();
}
public static final Creator<Choices> CREATOR = new Creator<Choices>() {
@Override
public Choices createFromParcel(Parcel in) {
return new Choices(in);
}
@Override
public Choices[] newArray(int size) {
return new Choices[size];
}
};
@Override
public String toString() {
return "Choices [isCorrect=" + isCorrect + ", choice=" + choice
+ "]";
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeByte((byte) (isCorrect ? 1 : 0));
dest.writeString(choice);
}
}
@ G.Blakeによる上記の回答で述べたように、選択肢をパーセル可能にする必要があり、AndroidはパーセルのArrayListsをパーセルする方法を知っています