代码之家  ›  专栏  ›  技术社区  ›  Adam Varhegyi

Android MP图表highlightValue不工作,引发ArrayIndexOutOfBoundsException

  •  1
  • Adam Varhegyi  · 技术社区  · 7 年前

    我在玩安卓 MP Chart lib可以画出很棒的图表。

    我试图在我的图表上突出显示价值观,但是 没有把重点放在正确的地方 ,或抛出 数组下标越界异常 .

    我为此做了一个小计划。当用户点击next按钮时, 高光应该移到正方向。

      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个 ? 有n个 我的代码里只有一个10 ,为什么 查特的函数得到-1?

    我在用

    com.github.PhilJay:MPAndroidChart:v3.0.3版

    如果可以的话请帮忙。

    电子数据:

    我又加了一句 combinedChart.setOnChartValueSelectedListener(this); 到图表上。

    有了这个回调 onValueSelected(Entry, 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));
        }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Misha Akopov Bouchaib Ennakr    7 年前

    以下是解决方案:

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

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

    解释 :

    Highlight 构造函数的第一个参数是X值,即您增加或减少的值。第二个是要选择的图的索引。因为只有一个,所以在那里指定0。另外,您应该第二次指定它 高.setDataIndex(0); (否则将被视为-1,bug!)你的代码将起作用:

    enter image description here