如何在MPAndroidChart BarChart中点击按钮更新X/Y轴数据
解决MPAndroidChart BarChart数据与X轴标签同步更新问题
问题场景
使用MPAndroidChart的BarChart组件时,通过arrayList1存储X轴标签(如math、english),自定义ValueFormatter将X轴数值映射为对应标签;score_array存储Y轴分数数据,调用Set_BarChar_Data初始化图表。点击按钮需要替换X轴标签列表(如english、biology、c#)并更新对应Y轴数据,但当前操作无法实现X轴与Y轴数据的正确同步更新。
错误原因分析
score_array未清空直接追加数据,导致数据长度与新标签列表长度不匹配,BarEntry索引和标签索引错位- X轴的
ValueFormatter依赖arrayList1,更新标签后未触发X轴格式刷新 - 数据集合长度变化时,仅调用
notifyDataChanged和notifyDataSetChanged无法让图表重新计算轴范围
修正方案
- 更新数据前清空
arrayList1和score_array,确保两者长度严格对应 - 更新标签后,重新设置X轴的
ValueFormatter,确保关联新标签列表 - 数据长度变化时,重新构建
BarData并设置给图表,保证图表重新计算轴范围
修正后代码
初始设置代码
arrayList1.add("math"); arrayList1.add("english"); arrayList1.add("biology"); arrayList1.add("computer"); arrayList1.add("java"); arrayList1.add("c"); // 初始化分数数据 for (int i = 0; i < arrayList1.size(); i++) { score_array.add((float) 0); } // 设置X轴格式化器 ValueFormatter valueFormatter = new ValueFormatter() { @Override public String getFormattedValue(float value) { if (value >= 0 && value < arrayList1.size()) { return arrayList1.get((int) value); } else { return ""; } } }; xAxis.setValueFormatter(valueFormatter); arrayList_BarEntry = Set_BarChar_Data(score_array, null);
按钮点击触发代码
// 清空旧数据和标签 arrayList1.clear(); score_array.clear(); // 添加新标签 arrayList1.add("english"); arrayList1.add("biology"); arrayList1.add("c#"); arrayList1.add("python"); arrayList1.add("biology"); arrayList1.add("math"); // 添加对应新分数数据(示例为100,可替换为实际需求数据) for (int i = 0; i < arrayList1.size(); i++) { score_array.add((float) 100); } // 重新设置X轴格式化器,关联新标签列表 xAxis.setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { if (value >= 0 && value < arrayList1.size()) { return arrayList1.get((int) value); } else { return ""; } } }); arrayList_BarEntry = Set_BarChar_Data(score_array, null);
Set_BarChar_Data方法代码
ArrayList<BarEntry> Set_BarChar_Data(@NotNull ArrayList<Float> score_array, @Nullable Integer high_position) { ArrayList<BarEntry> values = new ArrayList<>(); for (int i = 0; i < score_array.size(); i++) { values.add(new BarEntry((float) i, score_array.get(i))); } BarDataSet set1; if (teacher_score_barchart.getData() != null && teacher_score_barchart.getData().getDataSetCount() > 0) { set1 = (BarDataSet) teacher_score_barchart.getData().getDataSetByIndex(0); set1.setValues(values); if (high_position != null) { set1.setHighLightColor(lessons_colors.get(high_position)); } // 数据长度变化时,重新设置BarData确保轴范围更新 BarData newData = new BarData(set1); teacher_score_barchart.setData(newData); teacher_score_barchart.setFitBars(true); } else { set1 = new BarDataSet(values, "score"); set1.setColors(lessons_colors); set1.setDrawValues(false); ArrayList<IBarDataSet> dataSets = new ArrayList<>(); dataSets.add(set1); BarData data = new BarData(dataSets); teacher_score_barchart.setData(data); teacher_score_barchart.setFitBars(true); } // 强制刷新图表 teacher_score_barchart.invalidate(); teacher_score_barchart.animateXY(1000, 1000); return values; }
内容的提问来源于stack exchange,提问作者tong xi
相关产品推荐
相关产品推荐

