2012-12-04 15 views
11

Amacıyla bir ArrayList nesnesi iletmeye çalışıyorum, ancak çalışmasını sağlayamıyorum. İşte ne var:Nesnelerin Niyetini Geçirerek Geçirme - Java (Android)

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 burada alınıyorsa:

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... 
    } 
} 

iki ints, correctAnswer ve wrongAnswers, alınıyorsa ve bunları kullanabilir. ArrrayList gelmiyor. EndQuiz() yönteminde hata yok, ancak 'qs = getIntent(). GetParcelableArrayListExtra ("sorgular");' bir hata atıyor ve "Bound Mismatch" diyor.

Bu konuda herhangi bir yardım için teşekkür ederiz!

Soru sınıfı:

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; 
    } 
    } 
+1

"Soru" sınıfınız [Parcelable] uygular mı (http://developer.android.com/reference/android/os/Parcelable.html)? – wsanville

+3

hayır ... bu yüzden neden yapıyor? '(ArrayList sorgularını genişletir);' :) kesinlikle yardımcı olmayacaktır – Selvin

+0

ArrayList sorgularının türünün gerçekte nasıl göründüğünü görebilir miyiz? Sınıfı kastediyorum ... – LuxuryMode

cevap

25

. Parceble arayüzü ilk başta kafa karıştırıcı olabilir ... ama oraya asın.

odaklanmanız gereken iki Parcelable yöntem vardır:

bir Parsel nesnesine sınıfınızı dönüştürür
  • writeToParcel(). Bir Parsel nesnesini tekrar sınıfınızın kullanılabilir örneğine dönüştüren
  • Question(Parcel in).

& güvenli bir şekilde kesip, işaretlediğim diğer Parcelable bilgilerini yapıştırabilirsiniz. Eğer Niyet ekstralar içine queries koymak nasıl

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

Şimdi değiştirin: Ben sadece soru sınıfının bir kısmını kullanacak Basitlik açısından

.

intent.putParcelableArrayListExtra("queries", queries); 

Parcelable dizisini okuma biçiminiz olduğu gibi mükemmeldir.

+0

Bu detaylı cevap için teşekkürler Sam! Sana bütün kodumu vermedim, bu yüzden seni fırlatabilirim. Açılış yazımı tüm derslerimle düzenledim. Şimdi bununla birlikte, Parcelable'ı uygulamalı ve tüm diğer yöntemleri AddView veya Soru'ya ekleyeyim mi? – Matt

+0

Sadece bir ArrayList Sorgusu iletmek istersiniz, bu nedenle sadece Soru sınıfı Parcelable – Sam

+0

Ah erkeğini uygulamalıdır. Bu, üzerinde çalıştığım en büyük 2 aydır. Bugün büyük kilometre taşı! Tekrar teşekkürler Sam. :) – Matt

7

amacıyla bir Niyet parçası olarak bir ArrayList teslim edebilmek için, senin tipin Parcelable uygulamalıdır. Listenizi (ArrayList<? extends Parcelable>)'a göndermeniz gerektiğine karar vererek bunu yapmadınız. Eğer olsaydı, sadece olabilir: Aslında Parcelable uygulamak için Question sınıfını değiştirmek zorunda

class Foo implements Parcelable { 
//implementation here 
} 
ArrayList<Foo> foos = new ArrayList<Foo>(); 
new Intent().putParcelableArrayListExtra("foos", foos); //no need to cast 
+0

Parcelable'ı uygulamak gerekli değildir, ancak bunun için Seri hale getirilebilir kullanılması bir performans cezası gerektirir, bu yüzden Parcelable'ı kullanmalısınız. –

İlgili konular