首页 > 解决方案 > Android MP Chart highlightValue 不起作用,抛出 ArrayIndexOutOfBoundsException

问题描述

我正在使用 Android MP Chart lib 来绘制很棒的图表。

我正在尝试突出显示图表上的值,但它没有将突出显示到正确的位置,或者抛出ArrayIndexOutOfBoundsException

我为它做了一个小虚拟项目。当用户单击下一个按钮时,突出显示应该向正方向移动。

  public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    final int DATA_MAX_COUNT = 30;

    List<MyData> list    = new ArrayList<>(); ///<Dummy data stored in here
    List<Entry>  entries = new ArrayList<>(); ///<Entries for MP Chart

    int highlightIndex = 0; ///<Chart's data index to be highlighted

    CombinedChart combinedChart; ///<I use combined chart because there will be more data sets added later on

    Button prevBtn; ///<Button for highlight control
    Button nextBtn; ///<Button for highlight control

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        combinedChart = (CombinedChart) findViewById(R.id.chart);

        prevBtn = (Button) findViewById(R.id.prev_btn);
        prevBtn.setOnClickListener(this);

        nextBtn = (Button) findViewById(R.id.next_btn);
        nextBtn.setOnClickListener(this);

        generateData();
        drawChart();
    }


    @Override
    public void onClick(View v) {

        //Clicking buttons should move the highlighted value
        if (v.equals(prevBtn)) {
            if (highlightIndex > 0) {
                highlightIndex--;
            }
        } else if (v.equals(nextBtn)) {
            if (highlightIndex + 1 < DATA_MAX_COUNT) {
                highlightIndex++;
            }
        }

        //Does not work, throws exception
        //combinedChart.highlightValue(new Highlight(highlightIndex, 0, 0));

        //Does not work, throws exception
        //combinedChart.highlightValue(highlightIndex, 0, false);

        //Exception

//        java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
//        at com.github.mikephil.charting.data.CombinedData.getDataByIndex(CombinedData.java:152)
//        at com.github.mikephil.charting.data.CombinedData.getEntryForHighlight(CombinedData.java:183)
//        at com.github.mikephil.charting.charts.Chart.highlightValue(Chart.java:635)
//        at com.github.mikephil.charting.charts.Chart.highlightValue(Chart.java:613)


        //Works, but highlights value on chart with like x=0 and y= 190, wtf?
        combinedChart.highlightValue(combinedChart.getHighlighter().getHighlight(highlightIndex, 0));


    }


    //Generating random data to a list
    public void generateData() {
        for (int i = 0; i < DATA_MAX_COUNT; i++) {
            MyData myData = new MyData(new Random().nextInt(100) + 100);
            list.add(myData);
        }
    }

    //Simple func for adding data to entries and drawing chart
    private void drawChart() {

        CombinedData combinedData = new CombinedData();

        for (int i = 0; i < list.size(); i++) {
            MyData myData = list.get(i);
            entries.add(new Entry(i, myData.getValue(), myData));
        }

        LineDataSet lineDataSet = new LineDataSet(entries, "My data list");

        lineDataSet.setHighLightColor(Color.RED);
        lineDataSet.setHighlightLineWidth(3);

        LineData lineData = new LineData();
        lineData.addDataSet(lineDataSet);

        combinedData.setData(lineData);
        combinedChart.setData(combinedData);

        combinedChart.invalidate();
    }


    //Dummy data class
    public static class MyData {

        private int value;

        public MyData(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
    }
}

我不明白为什么我会得到

java.lang.ArrayIndexOutOfBoundsException:长度=10;指数=-1

因为-1到底是什么?什么是10?我的代码中没有一件事是 10,为什么图表的任何函数都得到-1?

我正在使用

com.github.PhilJay:MPAndroidChart:v3.0.3

如果可以的话请帮忙。

编辑:

我已添加 combinedChart.setOnChartValueSelectedListener(this);到图表中。

有了这个回调onValueSelected(Entry, Highlight),我可以用另一种方式测试这个东西。它给出了一个 Highlight 对象。如果我在这个回调中什么都不做,图表会很好地绘制亮点。如果我用相同的 X 值以编程方式调用它,它会抛出通常的异常或将突出显示到错误的位置。(归零)

查看回调:

 @Override
    public void onValueSelected(Entry e, Highlight h) {
        float x = h.getX();

        Log.i("Highlighted", "Actual highlight: " + x);

        //Getting the same exception as above
        //combinedChart.highlightValue(x, 0, false);

        //Does not works, draws to x=0 position with any given x
        combinedChart.highlightValue(combinedChart.getHighlighter().getHighlight(x, 0));
    }

标签: javaandroidkotlinmpandroidchartcombinedchart

解决方案


这是解决方案:

Highlight high = new Highlight(highlightIndex, 0, 0);
high.setDataIndex(0);
combinedChart.highlightValue(high, false);

您需要添加high.setDataIndex(0);行。

说明

Highlight构造函数中第一个参数是X值,你增加或减少的值。其次是您要选择的图表索引。由于您只有一个,因此您在此处指定 0。此外,您应该第二次指定它high.setDataIndex(0);(否则它被视为 -1,错误!)并且您的代码将起作用:

在此处输入图像描述


推荐阅读