Android MP 图表 highlightValue 无效,抛出 ArrayIndexOutOfBoundsException
Android MP Chart highlightValue not working, throws 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: length=10; index=-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));
}
解决方法如下:
Highlight high = new Highlight(highlightIndex, 0, 0);
high.setDataIndex(0);
combinedChart.highlightValue(high, false);
您需要添加 high.setDataIndex(0);
行。
解释:
在Highlight
构造函数第一个参数是X值,这个值你增减。其次是您想要 select 的图表索引。因为你只有一个,所以你在那里指定 0。您还应该第二次指定它 high.setDataIndex(0);
(否则它被视为 -1,错误!)并且您的代码将起作用:
我正在使用 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: length=10; index=-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));
}
解决方法如下:
Highlight high = new Highlight(highlightIndex, 0, 0);
high.setDataIndex(0);
combinedChart.highlightValue(high, false);
您需要添加 high.setDataIndex(0);
行。
解释:
在Highlight
构造函数第一个参数是X值,这个值你增减。其次是您想要 select 的图表索引。因为你只有一个,所以你在那里指定 0。您还应该第二次指定它 high.setDataIndex(0);
(否则它被视为 -1,错误!)并且您的代码将起作用: