MPAndroidChart堆积的条形图显示错误/重复的值

问题描述

我正在尝试建立一个条形图以使用MPAndroidChart显示一周中的每日数据。数据显示为本地化,因此根据一周的第一天(星期一或星期日)进行排列。一些数据被复制并添加到几个条形图中,而某些显示错误的条形图中。我已经尝试解决一个星期,没有运气。

这是我处理数据的方式:

List<String> dailyIncomes = new ArrayList<>(7);
        List<String> dailyExpenses = new ArrayList<>(7);
        for (int x = 0; x < 7; x++) {
            dailyIncomes.add("0");
            dailyExpenses.add("0");
        }
for (int i = 0; i < transactionsList.size(); i++) {
            TransactionItem currentTransaction = transactionsList.get(i);
            DateTimeHandler dateTimeHandler = new DateTimeHandler(currentTransaction.getUserDate()); //my own class to get day,week or year
            int transactionYear = dateTimeHandler.getYear();
            int transactionWeek = dateTimeHandler.getWeekOfYear();
            int transactionDay = dateTimeHandler.getDayOfWeek();
            if (transactionWeek == week && transactionYear == year) {
       for (int d = 0; d < 7; d++) {
                    if (d + 1 == transactionDay) {
                        if (weekFields.getFirstDayOfWeek().getValue() == 7) {
                            if (transactionDay == 7) {
                                if (currentTransaction.getPrefix().equals("+")) {
                                    double dailyTotal = Double.parseDouble(dailyIncomes.get(0)) + currentTransaction.getAmountValue();
                                    dailyIncomes.add(0,"" + dailyTotal);
                                } else {
                                    double dailyTotal = Double.parseDouble(dailyExpenses.get(0)) + currentTransaction.getAmountValue();
                                    dailyExpenses.add(0,"" + dailyTotal);
                                }
                            } else {
                                if (currentTransaction.getPrefix().equals("+")) {
                                    double dailyTotal = Double.parseDouble(dailyIncomes.get(d + 1)) + currentTransaction.getAmountValue();
                                    dailyIncomes.add(d + 1,"" + dailyTotal);
                                } else {
                                    double dailyTotal = Double.parseDouble(dailyExpenses.get(d + 1)) + currentTransaction.getAmountValue();
                                    dailyExpenses.add(d + 1,"" + dailyTotal);
                                }
                            }

                        } else {
                            if (currentTransaction.getPrefix().equals("+")) {
                                double dailyTotal = Double.parseDouble(dailyIncomes.get(d)) + currentTransaction.getAmountValue();
                                dailyIncomes.add(d,"" + dailyTotal);
                            } else {
                                double dailyTotal = Double.parseDouble(dailyExpenses.get(d)) + currentTransaction.getAmountValue();
                                dailyExpenses.add(d,"" + dailyTotal);
                            }
                        }
                    }
                }
        }
}

WeeklyReport weeklyReport = new WeeklyReport(.....,dailyIncomes,dailyExpenses,....);

//to load next cards
        weekCount++;
        if (this.week == 1) {
            yearCount++;
            this.year = this.year - yearCount;
        }
        this.week = LocalDate.Now()
                .minusYears(yearCount)
                .minusWeeks(weekCount)
                .get(weekFields.weekOfWeekBasedYear());
        weeklyReportList.add(weeklyReport);
        adapter.submitList(weeklyReportList);
        adapter.notifyItemInserted(adapter.getItemCount() + 1);

如何将数据设置为图表:

List<BarEntry> dailyDetails = new ArrayList<>();
        for (int i = 0; i < 7; i++)
            dailyDetails.add(new BarEntry(
                    (float) i,new float[]{
                    Float.parseFloat(weeklyReport.getDailyIncomes().get(i)),Float.parseFloat(weeklyReport.getDailyExpenses().get(i))
            }));
        BarDataSet dailyDetailsSet = new BarDataSet(dailyDetails,"");
        String[] labels = {context.getString(R.string.incomes),context.getString(R.string.expenses)};
        //add x axis labels (days of week)
        WeekFields weekFields = WeekFields.of(Locale.getDefault());
        int firstDay = weekFields.getFirstDayOfWeek().getValue();
        Log.i(TAG,"first day: " + firstDay);
        final List<String> xLabels = new ArrayList<>();
        for (int x = 0; x < 7; x++)
            xLabels.add("DAY");
        if (firstDay == 7) {
            xLabels.add(0,LocalDate.Now().with(DayOfWeek.of(7)).getDayOfWeek().getdisplayName(TextStyle.SHORT,Locale.getDefault()));
            for (int z = 1; z < 7; z++)
                xLabels.add(z,LocalDate.Now().with(DayOfWeek.of(z)).getDayOfWeek().getdisplayName(TextStyle.SHORT,Locale.getDefault()));
        } else
            for (int y = 0; y < 7; y++)
                xLabels.add(LocalDate.Now().with(DayOfWeek.of(y + 1)).getDayOfWeek().getdisplayName(TextStyle.SHORT,Locale.getDefault()));
dailyDetailsSet.setStackLabels(labels);
        BarData data = new BarData(dailyDetailsSet);
        chartView.setData(data);
        chartView.getXAxis().setValueFormatter(new IndexAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
                return xLabels.get((int) value);
            }
        });
        chartView.invalidate();

该图表如下所示:

The chart looks like this

我已经尝试使用switch语句而不是循环,但是没有运气。我确信数据是准确的,因为还有其他一些图表,例如预算和月度报告,它们没有错。一定是一个愚蠢的错误,我已经尝试了三天,但总是有问题。

有人可以帮我指出我做错了什么吗?我非常感谢。谢谢。 (对不起,英语不好)

请问我是否需要查看更多代码

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)