首页 > 解决方案 > 布尔设置器和获取器在按钮单击时不更新?

问题描述

所以我目前正在开发一个日期 android 应用程序,现在我在这里所做的是创建一个称为similarDatesFunction此函数的简单算法,负责检索数据并将其与用户输入进行匹配,每次匹配都会放置一个计数器,如果超过 6计数器也称为offPeak变量,它将在我的CalendarValidation.setDateFlag();设置器上设置一个错误的布尔值。现在我将这个设置器调用/获取到另一个函数中,在该函数verifyValidations中我检查对象是否携带一个falsetrue值。现在这可行,但是有一个我无法弄清楚的问题。

当我运行android应用程序并输入详细信息时,它将根据我的firebase数据库在同一日期内找到3个用户的匹配项并返回false(这很好),但是当我更改日期然后按下按钮时我得到相同的消息是它无法预订并且仍然设置为假,但是如果我再次按下它,它会预订假期(知道日期是新的并且尚未在数据库中)并且现在设置为真,这反之亦然。本质上,布尔值不是在重置,而是在单击下一个按钮时继续?

我的代码:

public void verifyValidations() {

    //boolean sameDate = CalendarValidation.isSameDateFlag();

    CalendarInfo ci = new CalendarInfo();
    //store start dates fields individually
    String startYearData = ci.getStartDateYear();
    String startMonthData = ci.getStartDateMonth();
    String startDayData = ci.getStartDateDay();
    String startWeekData = ci.getStartDateWeek();
    String totalDateCode = startYearData + startMonthData + startDayData + startWeekData;

    //store end dates fields individually
    String endYearData = ci.getEndDateYear();
    String endMonthData = ci.getEndDateMonth();
    String endDayData = ci.getEndDateDay();
    String endWeekData = ci.getEndDateWeek();
    String endTotalDateCode = endYearData + endMonthData + endDayData + endWeekData;
    String fullDate = totalDateCode + endTotalDateCode;

    sameDatesFunction(totalDateCode,endTotalDateCode);

    if (!CalendarValidation.isSameDateFlag()){
        displayText.setText("No slots between these dates, choose another.");

    } else if (CalendarValidation.isSameDateFlag()){

        displayText.setText("Holiday is available, booking successful.");
    }



}

public void sameDatesFunction (final String startCode, final String endCode) {

    final int offPeak = 6;
    FirebaseFirestore db = FirebaseFirestore.getInstance();
    final Query query = db.collection("holidays").whereEqualTo("startDateReference",startCode);
    query.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

            //creating a map to obtain information
            Map<String, Object> test = new HashMap<>();
            //counter
            int similarStartEndCounter = 0;
            int userNameCounter = 0;
            boolean flag = false;

            //retrieve data as a hashmap document
            for (QueryDocumentSnapshot documentSnapshot: queryDocumentSnapshots){
                Note data = documentSnapshot.toObject(Note.class);
                test.put("startDateReference", data.getStartDateReference());
                test.put("endDateReference", data.getEndDateReference());
                Collection<Object> values = test.values();

                //retrieve results as single values
                for (Object string : values) {

                    if ((string.equals(startCode)) || (string.equals(endCode)) ) {
                        similarStartEndCounter++;
                    }
                }
            }

            if (similarStartEndCounter >= offPeak) {
                CalendarValidation.setSameDateFlag(false);
                System.out.println("I am in sameDates as false");

            } else {
                System.out.println("I am in sameDates as true");
                CalendarValidation.setSameDateFlag(true);
            }
        }
    });

}

日历验证.java

public class CalendarValidation {


    public static boolean sameDateFlag;

    public static boolean isSameDateFlag() {
        return sameDateFlag;
    }

    public static void setSameDateFlag(boolean sameDateFlag) {
        CalendarValidation.sameDateFlag = sameDateFlag;
    }

    public static boolean isSimilarFutureFlag() {
        return similarFutureFlag;
    }

    public static void setSimilarFutureFlag(boolean similarFutureFlag) {
        CalendarValidation.similarFutureFlag = similarFutureFlag;
    }

    public static boolean isSimilarPastFlag() {
        return similarPastFlag;
    }

    public static void setSimilarPastFlag(boolean similarPastFlag) {
        CalendarValidation.similarPastFlag = similarPastFlag;
    }

    public static boolean similarFutureFlag;
    public static boolean similarPastFlag;

}

标签: javaandroidfirebasealgorithmgoogle-cloud-firestore

解决方案


将此作为社区 Wiki 发布,因为它基于 @Tom 提供的评论。

问题是您正在执行一个操作以检查sameDateFlag等待数据库结果更新它的线程之前的状态,当您再次单击它时,该线程将完成,这就是它工作的原因。

我建议您查看这个社区问题,了解如何使用以下方法正确处理对 Firestore 的同步调用OnSuccessListener


推荐阅读