MPAndroidChart 的 ValueFormatter 重复了两次值

say*_*bir 2 android mpandroidchart

我想通过MPAndroidChart:v3.0.3这样创建图表,以便我将它的 lib 实现到我的 gradle 中。在我的 MainActivity 类中初始化图表后进行练习,如下所示:

barChart = findViewById(R.id.chart_report);
barChart.setDrawBarShadow(false);
barChart.setDrawValueAboveBar(true);
barChart.setPinchZoom(false);
barChart.setDrawGridBackground(true);
barChart.setFitBars(true);
Run Code Online (Sandbox Code Playgroud)

我有这样设置图表:

ArrayList<BarEntry> barEntries = new ArrayList<>();
barEntries.add(new BarEntry(1, 40f));
barEntries.add(new BarEntry(2, 20f));
barEntries.add(new BarEntry(3, 35f));
barEntries.add(new BarEntry(4, 15f));

BarDataSet barDataSet = new BarDataSet(barEntries, "DataSet1");
barDataSet.setColors(ColorTemplate.COLORFUL_COLORS);

BarData data = new BarData(barDataSet);
data.setBarWidth(0.3f);

barChart.setData(data);
Run Code Online (Sandbox Code Playgroud)

现在一切正常,但我想改变它XAxis,以便我创建一个类并实现 IAxisValueFormatter 接口,如下所示:

public class ChartAXisValueFormatter implements IAxisValueFormatter {
    private String[] mValues;

    public ChartAXisValueFormatter(String[] values) {
        mValues = values;
    }

    @Override
    public String getFormattedValue(float value, AxisBase axis) {

        int val = (int) (value);
        String label = "";
        if (val >= 0 && val < mValues.length) {
            label = mValues[val];
        } else {
            label = "";
        }
        return label;
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用这个类:

String[] report = new String[]{"A", "B", "C", "D"};
XAxis xAxis = barChart.getXAxis();
xAxis.setValueFormatter(new ChartAXisValueFormatter(report));
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
Run Code Online (Sandbox Code Playgroud)

但正如你所看到的,C重复了两次!!!我必须使用什么逻辑getFormattedValue来避免这个问题?

在此处输入图片说明

Mis*_*pov 6

发生这种情况是因为您必须为 xAxis 指定确切数量的标签:

xAxis.setLabelCount(barEntries.size());
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

另请参阅:https : //stackoverflow.com/a/48116532/3101777

还有一点修正,指数应该是:

int val = (int) (value) -1;
Run Code Online (Sandbox Code Playgroud)