Passing ArrayList of objects through intent - Java (Android)
android, android-intent, arraylist, java
Solution
You must change your `Question` class to actually implement Parcelable. The Parcelable interface can be confusing at first... but hang in there.
There are two Parcelable methods that you should focus on:
- `writeToParcel()` which converts your class into a Parcel object.
- `Question(Parcel in)` which converts a Parcel object back into usable instance of your class.
You can safely cut & paste the other Parcelable information that I marked.
For the sake of simplicity I will only use part of your Question class:
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];
}
};
}
Now change how you put `queries` into your Intent extras.
intent.putParcelableArrayListExtra("queries", queries);
The way you read the Parcelable array is perfect as it is.
Problem
I am trying to pass an ArrayList of objects through an intent but cannot get it to work. Here is what I have: ``` 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); } } ``` Intents are being received here: ``` 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... } } ``` The two ints, correctAnswer and wrongAnswers, are being received and I can use them. The ArrrayList is not coming through. No errors on in the endQuiz() method but the 'qs = getIntent().getParcelableArrayListExtra("queries");' is throwing an error and saying "Bound Mismatch." Any help on this is appreciated! Question class: ``` 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; } } ```