有什么方法可以清除ObservableList而不调用onChanged方法吗?

时间:2019-12-19 00:41:41

标签: android javafx

我有以下情况:

enter image description here

我有活动和几个片段。在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,然后从新的一天开始下载产品?

0 个答案:

没有答案
相关问题