2013-02-28 22 views
19

私はいくつかのトピックを検索しましたが、私の問題の解決策は見つかりませんでした。私のMainActivityでArrayList <?を渡します。 Parcelable> to Activityを実装しました

public class Series implements Parcelable { 
private String name; 
private int numOfSeason; 
private int numOfEpisode; 

/** Constructors and Getters/Setters have been removed to make reading easier **/ 

public Series(Parcel in) { 
    String[] data = new String[3]; 
    in.readStringArray(data); 
    this.name = data[0]; 
    this.numOfSeason = Integer.parseInt(data[1]); 
    this.numOfEpisode = Integer.parseInt(data[2]); 
} 


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

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeStringArray(new String[] { this.name, 
      String.valueOf(this.numOfSeason), 
      String.valueOf(this.numOfEpisode) }); 

} 

private void readFromParcel(Parcel in) { 
    name = in.readString(); 
    numOfSeason = in.readInt(); 
    numOfEpisode = in.readInt(); 
} 

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
    @Override 
    public Series createFromParcel(Parcel in) { 
     return new Series(in); 
    } 

    @Override 
    public Series[] newArray(int size) { 
     return new Series[size]; 
    } 
}; 

}

私は、ArrayListのを持っています。リストを動的に編集可能にするには、編集可能な別のアクティビティに渡す必要があります。

ArrayList<Series> listOfSeries = new ArrayList<Series>(); 

    public void openAddActivity() { 
    Intent intent = new Intent(this, AddActivity.class); 
    intent.putParcelableArrayListExtra(
      "com.example.episodetracker.listofseries", 
      (ArrayList<? extends Parcelable>) listOfSeries); 
    startActivity(intent); 
} 

リストをキャストする必要があります。それ以外の場合は、Eclipseから次のエラーメッセージが表示されます。 方法putParcelableArrayListExtra型テント内(文字列、ArrayListには)引数には適用されません(文字列、リスト)

が、これはそれを行うための正しい方法ですか?

ArrayList<Series> list = savedInstanceState 
      .getParcelableArrayList("com.example.episodetracker.listofseries"); 

これは別のアクティビティでデータを読み取ろうとする方法です。

これは上記の行にクラッシュしています。つまり、getParcelableArrayList部分です。

+0

1 /などの型と一致しなければならないことだった私は仕事しないのか理解していないのに役立ちますあなたのコードで。 2 /リストをどこかに保存しないでください?したがって、あなたはアクティビティからアクティビティに渡す配列ではなく、データベースで作業するのが最善ではないでしょうか? – njzk2

+0

Parcelablesは話す悪魔です...代わりにSerializableを作ろうとしましたか? – snowCrabs

+1

シリアライズがずっと遅いので、私はパーセルブルが行く方法であるという印象を受けましたか? –

答えて

28
  • 問題は、あなたが書き出す何...小包に書き出すと小包から読んで

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
        dest.writeString(name); 
        dest.writeInt(numOfSeason); 
        dest.writeInt(numOfEpisode); 
    } 
    
    private void readFromParcel(Parcel in) { 
        name = in.readString(); 
        numOfSeason = in.readInt(); 
        numOfEpisode = in.readInt(); 
    } 
    
  • であるあなたが読んでいるものと一致する必要があります...

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    
    Intent i = new Intent(this,SecondActivity.class); 
    
    ArrayList<testparcel> testing = new ArrayList<testparcel>(); 
    
    i.putParcelableArrayListExtra("extraextra", testing); 
    startActivity(i); 
    } 
    
        /**********************************************/ 
    
    
    public class SecondActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    
        ArrayList<testparcel> testing = this.getIntent().getParcelableArrayListExtra("extraextra"); 
    } 
    } 
    
  • 上記のコードは、2つの異なるアクティビティからのonCreate()を持っています。最初のものが2番目のものを起動します。それはうまく動作し、私は問題なしでparcelableを引き出すことができた。

+0

変更されました。ただし、NullPointerExceptionが残ります。この部分の内容は変更していません。 ArrayList list = savedInstanceState .getParcelableArrayList( "com.example.episodetracker.listofseries"); –

+0

バンドル内の名前は本当に問題ではありません"MyArray"をキーとしていればうまくいくはずです。どんなラインでクラッシュしていますか? – snowCrabs

+0

私の新しい活動で "ロード"する行にクラッシュする。具体的には、次の行があります。 ArrayList list = savedInstanceState .getParcelableArrayList( "com.example.episodetracker.listofseries"); –

2

IntentクラスでputParcelableArrayListExtra()メソッドを使用する必要があります。

+0

'intent.putParcelableArrayListExtra(\t \t" com.example.episodetracker.listofseries "、(ArrayList <?extends Parcelable>)listOfSeries); ' これは正しい方法ですか? **タイプIntentのputParcelableArrayListExtra(String、ArrayList <?extends Parcelable>)の引数には適用できません(String、List )** –

+9

あなたの 'listOfSeries'を' List'ではなく 'ArrayList'として宣言してください。 –

+1

さて、それはコンパイラを幸せにしました。 しかし、データを読み込めば、プログラムはまだクラッシュします。元の投稿をlogcatスニペットで更新しました。 –

3

私はBundleオブジェクトからputParcelableArrayList(<? extends Parcelable>)を使用しました。インテントオブジェクトから直接ではありません(私は実際に何が違うか分かりません)。しかし、私はこの方法で使用するために使用します。

ArrayList<ParcelableRow> resultSet = new ArrayList<ParcelableRow>(); 
resultSet = loadData(); 

Bundle data = new Bundle(); 
data.putParcelableArrayList("search.resultSet", resultSet); 
yourIntent.putExtra("result.content", data); 
startActivity(yourIntent); 

その後、あなたの新しい活動にあなたは最近、このようなバンドルオブジェクトに挿入されたデータを取り込むことができます。

Bundle data = this.getIntent().getBundleExtra("result.content"); 
ArrayList<ParcelableRow> result = data.getParcelableArrayList("search.resultset"); 

はちょうどあなたのArrayList<>しか含まなければならないことを覚えておいてくださいパーセル可能なオブジェクト。問題を回避するために、受け取ったデータがヌルであるかどうかを確認できるデータを渡したことを確認するだけです。

0

多分これは他の誰かが..私の問題は、私は書き込みとreadValueを使用しますが、それはのwriteInt、のreadInt WriteStringメソッド、readStringなど

関連する問題