我试图通过intent传递对象的ArrayList,但无法使其工作。这就是我所拥有的:
public class QuestionView extends Activity {
//variables and other methods...
public void endQuiz() {
Intent intent = new Intent(QuestionView.this, Results.class);
intent.putExtra("correctAnswers", correctAnswers);
intent.putExtra("wrongAnswers", wrongAnswers);
intent.putParcelableArrayListExtra("queries", queries);
startActivity(intent);
}
}
这里收到意图:
public class Results extends Activity {
int cAnswers;
int wAnswers;
ArrayList<Question> qs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.resultsmain);
cAnswers = getIntent().getIntExtra("correctAnswers", -1);
wAnswers = getIntent().getIntExtra("wrongAnswers", -1);
qs = getIntent().getParcelableArrayListExtra("queries");
//more code...
}
}
正在接收两个整数,correctAnswer和wrongAnswers,我可以使用它们。 ArrrayList没有通过。在endQuiz()方法中没有错误,但'qs = getIntent()。getParcelableArrayListExtra(“queries”);'抛出错误并说“绑定不匹配。”
对此有任何帮助表示赞赏!
问题类:
public class Question {
String a1;
String a2;
String a3;
String a4;
int correctAnswer;
String query;
int selectedAnswer;
boolean correctness;
public Question() {
}
public Question(String a1, String a2, String a3, String a4, int correctAnswer, String query, int selectedAnswer, boolean correctness) {
this.a1 = a1;
this.a2 = a2;
this.a3 = a3;
this.a4 = a4;
this.correctAnswer = correctAnswer;
this.query = query;
this.selectedAnswer = selectedAnswer;
this.correctness = correctness;
}
}
答案 0 :(得分:26)
您必须更改Question
类才能实际实现Parcelable。 Parcelable界面起初可能会让人感到困惑......但请挂在那里。
您应该关注两种Parcelable方法:
writeToParcel()
将您的类转换为Parcel对象。Question(Parcel in)
将Parcel对象转换回类的可用实例。你可以放心地切割&amp;粘贴我标记的其他Parcelable信息。
为了简单起见,我将只使用您的问题类的一部分:
public class Question implements Parcelable {
String a1;
String a2;
...
public Question(String a1, String a1) {
this.a1 = a1;
this.a2 = a2;
}
// Your existing methods go here. (There is no need for me to re-write them.)
// The following methods that are required for using Parcelable
private Question(Parcel in) {
// This order must match the order in writeToParcel()
a1 = in.readString();
a2 = in.readString();
// Continue doing this for the rest of your member data
}
public void writeToParcel(Parcel out, int flags) {
// Again this order must match the Question(Parcel) constructor
out.writeString(a1);
out.writeString(a2);
// Again continue doing this for the rest of your member data
}
// Just cut and paste this for now
public int describeContents() {
return 0;
}
// Just cut and paste this for now
public static final Parcelable.Creator<Question> CREATOR = new Parcelable.Creator<Question>() {
public Question createFromParcel(Parcel in) {
return new Question(in);
}
public Question[] newArray(int size) {
return new Question[size];
}
};
}
现在更改将queries
放入Intent附加内容的方式。
intent.putParcelableArrayListExtra("queries", queries);
您阅读Parcelable数组的方式非常完美。
答案 1 :(得分:7)
为了能够作为Intent的一部分传递ArrayList,您的类型必须实现Parcelable。从你必须将你的列表转换为(ArrayList<? extends Parcelable>)
的事实判断,你没有这样做。如果你有,你可以简单地:
class Foo implements Parcelable {
//implementation here
}
ArrayList<Foo> foos = new ArrayList<Foo>();
new Intent().putParcelableArrayListExtra("foos", foos); //no need to cast