2017-01-28 13 views
1

私は、newInstanceメソッドを使用してフラグメントを初期化します。次に、onCreateメソッドで引数を取得しようとします。フラグメント引数が正しく設定されていません

MainActivityでは、このフラグメントを実行してデータを表示します。

private void startShowCostsFragment() { 
    List<Cost> costs = mDBHelper.getAllCosts(); 
    Log.d(TAG, "startShowCostsFragment(). Costs size: " + costs.size()); 
    Fragment showCostsFragment = ShowCostsFragment.newInstance(costs); 
    showFragment(showCostsFragment); 
} 

private void showFragment(Fragment fragment) { 
    getSupportFragmentManager() 
      .beginTransaction() 
      .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, 
        android.R.anim.slide_in_left, android.R.anim.slide_out_right) 
      .replace(R.id.content_main, fragment) 
      .addToBackStack(null) 
      .commit(); 
} 

私はメソッドstartShowCostsFragmentを実行すると、フラグメントの2番目以降の引数が正しく設定されません。新しい値がメソッドに渡されたにもかかわらず、mCostsリストは値を変更しません。そして時にはメソッドonCreateはまったく呼び出しません。 フラグメントを何度も動的に置き換えたときに、引数をフラグメントに正しく挿入する方法は?

コストクラス:

public class Cost implements Parcelable { 
private int id; 
private int value; 
private String date; 
private String description; 
private List<Tag> tags = new ArrayList<>(); 

public Cost(int id, String date, int value, String description, List<Tag> tags) { 
    this.id = id; 
    this.value = value; 
    this.date = date; 
    this.description = description; 
    this.tags = tags; 
} 

public Cost(int value, String date, String description, List<Tag> tags) { 
    this.value = value; 
    this.date = date; 
    this.description = description; 
    this.tags = tags; 
} 

public Cost() { 

} 

public int getId() { 
    return id; 
} 

public int getValue() { 
    return value; 
} 

public String getDate() { 
    return date; 
} 

public String getDescription() { 
    return description; 
} 

public List<Tag> getTags() { 
    return tags; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public void setValue(int value) { 
    this.value = value; 
} 

public void setDate(String date) { 
    this.date = date; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public void setTags(List<Tag> tags) { 
    this.tags = tags; 
} 

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

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(this.id); 
    dest.writeInt(this.value); 
    dest.writeString(this.date); 
    dest.writeString(this.description); 
    dest.writeTypedList(this.tags); 
} 

protected Cost(Parcel in) { 
    this.id = in.readInt(); 
    this.value = in.readInt(); 
    this.date = in.readString(); 
    this.description = in.readString(); 
    this.tags = in.createTypedArrayList(Tag.CREATOR); 
} 

public static final Creator<Cost> CREATOR = new Creator<Cost>() { 
    @Override 
    public Cost createFromParcel(Parcel source) { 
     return new Cost(source); 
    } 

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

}

+0

データベースまたはその他の永続データストアを使用し、フラグメント内にデータをロードします。 – Selvin

答えて

0

Costクラスがバンドルとして、それを送信するためにParcelableを実装する必要があります。

編集:

あなたCostクラスがParcelableを実装した場合、あなたは(ArrayList<? extends Parcelable>) costsを行ったように、キャストを行う必要はありません。 キャストして実装していません。

public class Cost implement Parcelable {と実装。見てくださいhere

+0

Parcelableを実装しています。 – Andrew

+0

'onViewCreated()'のリストを取得してみてください –

+0

私は自分のアンサー時間を更新しました。見てみましょう。 –

関連する問題