2017-01-28 3 views
1

Я инициализирую фрагмент с использованием метода newInstance. И затем я пытаюсь получить аргументы в методе onCreate.Аргументы фрагмента не установлены правильно

public class ShowCostsFragment extends Fragment { 
public static final String TAG = "ShowCostsFragment"; 

private static final String ARG_COSTS = "costs"; 

private List<Cost> mCosts; 

public ShowCostsFragment() { 
} 

public static ShowCostsFragment newInstance(List<Cost> costs) { 
    ShowCostsFragment fragment = new ShowCostsFragment(); 
    Bundle args = new Bundle(); 
    args.putParcelableArrayList(ARG_COSTS, (ArrayList<? extends Parcelable>) costs); 
    fragment.setArguments(args); 
    Log.d(TAG, "newInstance(). Costs size: " + costs.size()); 
    return fragment; 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     mCosts = getArguments().getParcelableArrayList(ARG_COSTS); 
     Log.d(TAG, "onCreate(). Costs size: " + mCosts.size()); 
    } 
} 

В 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, второй и последующие аргументы времени в фрагменте устанавливаются неправильно. Список 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 для того, чтобы отправить его в пакет.

Edit:

Если Cost класс реализации Parcelable, вам не нужно делать бросок, как вы делали (ArrayList<? extends Parcelable>) costs. Вы делаете бросок, а не выполняете.

public class Cost implement Parcelable { и реализации. Посмотрите here.

+0

Он реализует Parcelable. – Andrew

+0

Попробуйте получить список в 'onViewCreated()' –

+0

Я обновил свой ответ несколько часов назад. Взглянуть. –

Смежные вопросы