2017-03-07 73 views
0

我需要將自定義類的ArrayList從一個實體「轉移」到另一個實體。我知道我需要實現Parcelable接口。ArrayList和Parcelable

這是我的自定義類。

public class cSportsList implements Parcelable { 
    boolean checked; 
    String name; 

    cSportsList(boolean check, String name_) { 
     checked = check; 
     name = name_; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     //Non posso passare un booleano e non posso fare il cast boolean -> int 
     if (checked) { 
      dest.writeInt(1); 
     } 
     else dest.writeInt(0); 
     dest.writeString(name); 
    } 

    public static final Parcelable.Creator<cSportsList> CREATOR = new Parcelable.Creator<cSportsList>() { 
     public cSportsList createFromParcel(Parcel in) { 
      return new cSportsList(in); 
     } 

     public cSportsList[] newArray(int size) { 
      return new cSportsList[size]; 
     } 
    }; 

    private cSportsList(Parcel in) { 
     if (in.readInt() == 1) { 
      checked = true; 
     } 
     else { 
      checked = false; 
     } 
     name = in.readString(); 


    } 
} 

這就是「從」

//This is sportsMap: ArrayList<cSportsList> sportsMap = new ArrayList<cSportsList>(); 
Intent intent = new Intent(getApplicationContext(),WhatSportActivity.class); 
intent.putParcelableArrayListExtra("sportsMap", (ArrayList<? extends Parcelable>) sportsMap); //I have tried with ArrayList<cSportsList> too. 
this.startActivity(intent); 

在實體代碼而這是實體代碼「到」

final Intent srcIntent = getIntent(); 
ArrayList<cSportsList> sportsMap = srcIntent.getParcelableExtra("sportsMap"); 

的問題是:在實體「到」 sportsMap爲null。 如果我在「writeToParcel」和「cSportsList(Parcelable in)」函數中設置了「斷點」,我發現這兩個函數都執行了代碼。

我的錯誤在哪裏?

謝謝。 M.

+0

用** getParcelableArrayListExtra **替換** getParcelableExtra **。 –

回答

0

使用下面的代碼

sportsMap = srcIntent.g etParcelableArrayListExtra( 「sportsMap」);

1

在閱讀你需要使用

srcIntent.getParcelableArrayListExtra("sportsMap"); 

要投入使用意向下面的代碼

intent.putParcelableArrayListExtra("sportsMap", sportsMap); 

,並從意向讀它,使用

ArrayList<cSportsList> sportsMap = srcIntent.getParcelableArrayListExtra("sportsMap"); 

Pass ArrayList<? implements Parcelable> to Activity

0

閱讀類似的解決方案,您應該使用:

ArrayList<cSportsList> sportsMap = srcIntent.getParcelableArrayListExtra("sportsMap"); 
0

您還可以使用序列化一樣。

public class cSportsList implements Serializable

認沽:

intent.putExtra("LIST",list);

對於GET:

(ArrayList<>)intent.getSerializableExtra("LIST");

+0

我讀過Parcelable比Serialize更好。但是:謝謝。 – ZioBudda

0

嘗試通過的ArrayList,而不是鑄像這樣的:

Intent intent = new Intent(getApplicationContext(),WhatSportActivity.class); 
intent.putParcelableArrayListExtra("sportsMap", sportsMap); 
     startActivity(intent); 

在WhatSportActivity,

final Intent srcIntent = getIntent(); 
ArrayList<cSportsList> sportsMap = srcIntent.getParcelableExtra("sportsMap"); 

如果你還有問題,請嘗試使用 「Parceable」 插件,因爲它實現Parceable減少使用Parceable列表中的錯誤。

相關問題