我有以下情况:
我有活动和几个片段。在onCreate方法开始时,我总是加载上图中的片段:
private void setInitialFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
DietDiaryFragment dietDiaryFragment = (DietDiaryFragment) fragmentManager.findFragmentByTag("DietDiaryFragment");
if (dietDiaryFragment == null) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
dietDiaryFragment = new DietDiaryFragment();
setArguments(dietDiaryFragment);
fragmentTransaction.add(R.id.content_main_screen, dietDiaryFragment,"DietDiaryFragment");
fragmentTransaction.commit();
}
}
setArguments方法如下:
private void setArguments(DietDiaryFragment dietDiaryFragment) {
Bundle bundle = new Bundle();
bundle.putParcelable("breakfast", breakfast);
bundle.putParcelable("lunch", lunch);
bundle.putParcelable("dinner", dinner);
bundle.putParcelable("snacks", snacks);
dietDiaryFragment.setArguments(bundle);
}
在活动中,我根据日期从Firebase下载一顿饭的所有产品,并将其发送到上面显示的片段中:
private void getProductsFromDatabaseLunch() {
lunch.getTotalProducts().clear();
lunch.getIdProducts().clear();
lunch.setTotalCalories(0);
firebaseFirestore.collection("Users").document(currentUserUID)
.collection("Types of Meals").document("Lunch")
.collection("Date of Lunch").document(date)
.collection("List of Products")
.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful()) {
for(DocumentSnapshot documentSnapshot: task.getResult().getDocuments()) {
lunch.getIdProducts().add(documentSnapshot.getId());
lunch.getTotalProducts().add(documentSnapshot.toObject(Product.class));
}
lunch.calculateTotalCalories();
onSendTotalCaloriesLunch.sendTotalCaloriesLunch(lunch.getTotalCalories());
}
if(getFragmentRefreshLunchAdapter() != null) {
getFragmentRefreshLunchAdapter().refreshLunchAdapter();
}
}
});
}
从Firebase下载产品是异步的,因此只有添加了一段时间的产品之后,才会传递没有产品的第一个空ArrayList。
为了执行一些计算并显示获得的结果,我使用了ObservableList,它告诉我产品是从Firebase下载的。
observableProductListSnacks.addAll(snacks.getTotalProductsOfMeal());
onChanged方法:
observableProductListBreakfast.addListener(new ListChangeListener<Product>() {
@Override
public void onChanged(Change<? extends Product> change) {
Log.i("Calories 1", String.valueOf(breakfast.getTotalCaloriesOfMeal()));
breakfast.calculateTotalCarbohydratesOfMeal();
breakfast.calculateTotalProteinOfMeal();
breakfast.calculateTotalFatOfMeal();
breakfast.calculateTotalCaloriesOfMeal();
Log.i("Calories 2", String.valueOf(breakfast.getTotalCaloriesOfMeal()));
if(breakfast.getTotalProductsOfMeal().size() == 0) {
textViewTotalCaloriesBreakfast.setText("");
} else {
textViewTotalCaloriesBreakfast.setText(product.formatNumberWithoutDecimalPlaces(breakfast.getTotalCaloriesOfMeal()));
}
}
});
问题是当我扩展日历并在两天之间导航时,产品将不断添加到observableProductListSnacks中。因此,更改日期后,我尝试清除observableProductListSnacks,但是...然后onUpdate方法执行两次。有什么办法可以避免这种情况?还是产品在observableProductListSnacks的不同日期堆积起来不是问题吗?还是执行两次onUpdate方法不是问题,因为我清除了observableProductListSnacks,然后从新的一天开始下载产品?