Passing ArrayList of objects through intent - Java (Android)

前端 未结 2 1998
无人及你
无人及你 2020-12-31 09:02

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 {

         


        
相关标签:
2条回答
  • 2020-12-31 09:17

    In order to be able to deliver an ArrayList as part of an Intent, your type must implement Parcelable. Judging by the fact you had to cast your List to (ArrayList<? extends Parcelable>), you didn't do this. If you had, you could simply have:

    class Foo implements Parcelable {
    //implementation here
    }
    ArrayList<Foo> foos = new ArrayList<Foo>();
    new Intent().putParcelableArrayListExtra("foos", foos); //no need to cast
    
    0 讨论(0)
  • 2020-12-31 09:36

    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.

    0 讨论(0)
提交回复
热议问题