web-dev-qa-db-ja.com

オブジェクトのArrayListをインテントに渡す-Java(Android)

オブジェクトの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...
    }
}

2つのint、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;
    }
    }
13
Matt

実際にParcelableを実装するには、Questionクラスを変更する必要があります。パーセル可能なインターフェースは、最初は混乱する可能性があります...しかし、そこにとどまります。

あなたが焦点を合わせるべき2つのParcelableメソッドがあります:

  • writeToParcel()これはクラスをParcelオブジェクトに変換します。
  • Question(Parcel in)は、Parcelオブジェクトをクラスの使用可能なインスタンスに変換し直します。

私がマークした他の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.putParcelableArrayListExtra("queries", queries);

Parcelable配列の読み方は、そのままで完璧です。

27
Sam

インテントの一部として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
7
LuxuryMode