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; } } ```

Original source