java - Android Studio,更改 MP BarChart 数据时应用程序崩溃
问题描述
我发现了多个具有类似问题的表格,但没有一个导致解决方案。
我正在尝试使用 MPlibrary 在 android 中创建一个 barChart 来显示每天的花费。我有两个按钮“每周按钮”:显示过去 7 天的费用(7 个图表条,7 个 X 轴标签)“每月按钮”:按季度显示过去一个月的费用(4 个图表条,4 个 X 轴标签)
只有一个条形图,上面的按钮更新条形图
两个按钮都可以正常工作,除了当我从“每周”按钮切换到“每月”按钮时应用程序崩溃。这是我的代码:
barChart = root.findViewById(R.id.barChart);
BarDataSet barDataSet = new BarDataSet(expenseModelData.getExpenseBarEntries(), "Expenses($)");
barDataSet.setValueTextColor(getResources().getColor(R.color.black));
barDataSet.setColor(getResources().getColor(R.color.design_default_color_primary_dark));
barDataSet.setValueTextSize(16f);
BarData barData = new BarData(barDataSet);
barChart.setData(barData);
barChart.setTouchEnabled(true);
barChart.setDragEnabled(true);
barChart.setScaleEnabled(true);
barChart.getDescription().setEnabled(false);
ValueFormatter formatter = new ValueFormatter() {
@Override
public String getAxisLabel(float value, AxisBase axis) {
return expenseModelData.getExpenseDates()[(int) value];
}
};
XAxis xAxis = barChart.getXAxis();
xAxis.setGranularity(1f);
xAxis.setValueFormatter(formatter);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
weekly_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
expenseModelData.setDataForWeeklyExpense();
expenseModelData.generateBarChart(barChart, expenseModelData.getExpenseBarEntries(), expenseModelData.getExpenseDates(), getActivity());
}
});
monthly_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
expenseModelData.setDataForMonthlyExpense();
expenseModelData.generateBarChart(barChart, expenseModelData.getExpenseBarEntries(), expenseModelData.getExpenseDates(), getActivity());
}
});
我创建了 generateBarChart() 方法来更新 barChart
public void generateBarChart(BarChart barChart, ArrayList<BarEntry> currExpenseBarEntries, String[] currExpenseDates, Context context) {
//barChart.invalidate();
barChart.clear();
BarDataSet barDataSet = new BarDataSet(currExpenseBarEntries, "Expenses($)");
barDataSet.setValueTextColor(context.getResources().getColor(R.color.black));
barDataSet.setColor(context.getResources().getColor(R.color.design_default_color_primary_dark));
barDataSet.setValueTextSize(16f);
BarData barData = new BarData(barDataSet);
barChart.setData(barData);
barChart.setTouchEnabled(true);
barChart.setDragEnabled(true);
barChart.setScaleEnabled(true);
barChart.getDescription().setEnabled(false);
barChart.notifyDataSetChanged();
ValueFormatter formatter = new ValueFormatter() {
@Override
public String getAxisLabel(float value, AxisBase axis) {
return currExpenseDates[(int) value];
}
};
XAxis xAxis = barChart.getXAxis();
xAxis.setGranularity(1f);
xAxis.setValueFormatter(formatter);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
}
我的堆栈跟踪和一些研究表明问题出在我的 ValueFormatter 上。我收到 IndexOutOfBound 异常。到目前为止我尝试过的事情:
- 删除了所有 ValueFormatter 行(应用程序工作正常,但我丢失了正确的 x 轴标签)
- 从主代码和方法代码中添加/删除 ValueFormatter 行(尝试了所有添加/删除组合)
- 添加 barChart.notifyDataSetChanged();
- 添加 barChart.invalidate() && barChart.clear()
- 确保我的 barData 和 x 轴标签正确更新(它们是)
没有解决问题。我将不胜感激。
解决方案
推荐阅读
- r - Web抓取一个延伸到R中“下一页”页面(不更改url)的表
- firebase - 想要创建一个预定的 Firestore 脚本。需要指点
- php - 如何在php中解决未定义的通知2和3
- python - 从 Excel 到元组列表
- json - 如何在本机反应中迭代json数据
- python - 如何使用 numpy.pad 用 RGB 值填充 RGB 图像
- c# - 检查数组的所有对象是否同时处于活动状态 Unity C#
- c# - Xunit如何测试十进制属性和字符串是否为空
- python - 菜单驱动的python程序在命令行中传递值
- c# - 如何从 WPF 应用程序代码中导出字符串以进行国际化?