android - 有什么方法可以在不调用 onChanged 方法的情况下清除 ObservableList?
问题描述
我有以下情况:
我有活动和几个片段。在 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 下载产品是异步的,所以第一个没有产品的空 ArrayLists 将被传递,只有在一段时间后产品被添加。
为了执行一些计算并显示获得的结果,我使用了 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 然后从新的一天下载产品?
解决方案
推荐阅读
- javascript - 影响非日期相关搜索查询的日期格式
- computer-science - 如果我们“假设” P 不等于 NP,为什么 NP 可能等于 co-NP 背后的直觉
- javascript - 根据当前时间更改 iFrame 中的源 URL
- git - 如何在不遇到虚假冲突的情况下合并 master 中压缩提交的更改?
- java - 为什么最后一个 BarEntry 隐藏时条形图会消失?
- javascript - 如何在 x 秒结束之前停止函数返回新结果,如果调用过早返回先前的结果
- python - CORS 的 Flask SocketIO 问题
- python - 在 CONDA 环境中仅使用 PIP 有哪些陷阱?
- javascript - NeutralinoJS 存储
- python - 具有多个数据库连接的 lambda 上的 SqlAlchemy 和 pyMysql 连接池