MPAndroidChart折线图中途停止更新新数据问题求助
看起来你遇到的问题主要是X轴数据不同步和数据集Entry索引不匹配导致的,MPAndroidChart对X轴数量与每个数据集的Entry数量一致性要求很高,当两者不匹配时就会出现数据停止显示、图表空掉的情况。我帮你梳理下代码里的几个关键问题,再给出修复后的完整代码:
问题分析
X轴数据重复添加:
你在addEntry和addO2Entry里都调用了data.addXValue(""),这会导致X轴的条目数是两个数据集Entry总数的总和,而每个数据集的Entry数量只占一半,当图表滚动时,后面的X轴没有对应的Entry数据,就会显示为空。Entry的X索引错误:
创建Entry时用了set.getEntryCount()作为X索引,比如心率数据集的Entry索引是自己的计数,血氧数据集也是自己的计数,但X轴的索引是全局的,这会导致两个数据集的Entry对应到不同的X轴位置,最终数据无法正确对齐,甚至超出X轴范围后消失。图表滚动逻辑不统一:
只有addEntry里设置了setVisibleXRange和moveViewToX,当单独添加血氧数据时,图表不会自动滚动到最新位置,而且两个数据集的更新逻辑不一致,容易导致数据不同步。
修复方案
我调整了代码逻辑,统一管理X轴数据,同步两个数据集的Entry索引,并且把图表刷新和滚动的逻辑抽成公共方法,确保每次添加数据时都能正确更新:
public class LineGraphFragment extends Fragment { private LineChart heartRateGraph; private YAxis yAxis; // 维护全局X轴计数器,确保两个数据集的Entry索引一致 private int xIndexCounter = 0; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.line_graph_fragment, container, false); heartRateGraph = view.findViewById(R.id.heartRateGraph); heartRateGraph.setDescription(""); heartRateGraph.setHighlightPerTapEnabled(true); heartRateGraph.setDragEnabled(true); heartRateGraph.setScaleEnabled(true); heartRateGraph.setDrawGridBackground(false); heartRateGraph.setPinchZoom(true); heartRateGraph.setBackgroundColor(getResources().getColor(R.color.colorBlack, null)); LineData data = new LineData(); data.setValueTextColor(Color.WHITE); heartRateGraph.setData(data); Legend legend = heartRateGraph.getLegend(); legend.setForm(Legend.LegendForm.LINE); legend.setTextColor(Color.WHITE); XAxis xAxis = heartRateGraph.getXAxis(); xAxis.setTextColor(Color.WHITE); xAxis.setDrawGridLines(false); xAxis.setAvoidFirstLastClipping(true); yAxis = heartRateGraph.getAxisLeft(); yAxis.setTextColor(Color.WHITE); yAxis.setDrawGridLines(true); yAxis.setAxisMinValue(MainActivity.lowLimitHeartRate - 20); yAxis.setAxisMaxValue(200f); YAxis yAxis2 = heartRateGraph.getAxisRight(); yAxis2.setEnabled(false); return view; } public void setOpacityLow(){ heartRateGraph.setAlpha(0.2f); } public void setOpacityNormal(){ heartRateGraph.setAlpha(1.0f); } public void addEntry(int rate){ LineData data = heartRateGraph.getData(); if(data != null){ LineDataSet set = (LineDataSet) data.getDataSetByIndex(0); if(set == null){ set = createSet(); data.addDataSet(set); } // 确保每个时间点只添加一个X轴条目 if(data.getXValCount() <= xIndexCounter){ data.addXValue(String.valueOf(xIndexCounter)); } // 使用全局计数器作为Entry的X索引 data.addEntry(new Entry(rate, xIndexCounter), 0); updateChart(data); } } public void addO2Entry(int o2){ LineData o2data = heartRateGraph.getData(); if(o2data != null){ LineDataSet set2 = (LineDataSet) o2data.getDataSetByIndex(1); if(set2 == null){ set2 = createSet2(); o2data.addDataSet(set2); } // 同步X轴条目添加逻辑 if(o2data.getXValCount() <= xIndexCounter){ o2data.addXValue(String.valueOf(xIndexCounter)); } // 使用全局计数器作为Entry的X索引 o2data.addEntry(new Entry(o2, xIndexCounter), 1); updateChart(o2data); } } // 统一处理图表刷新与滚动逻辑 private void updateChart(LineData data){ heartRateGraph.notifyDataSetChanged(); // 设置可见X轴范围为30个数据点 heartRateGraph.setVisibleXRangeMaximum(30); // 滚动到最新数据位置 heartRateGraph.moveViewToX(data.getXValCount() - 1); // 计数器自增,为下一次数据添加做准备 xIndexCounter++; } private LineDataSet createSet(){ LineDataSet set = new LineDataSet(null, "Heart Rate"); set.setDrawCubic(true); set.setCubicIntensity(0.2f); set.setAxisDependency(YAxis.AxisDependency.LEFT); set.setColor(ColorTemplate.getHoloBlue()); set.setLineWidth(2f); set.setCircleRadius(2f); set.setFillAlpha(65); set.setFillColor(ColorTemplate.getHoloBlue()); set.setHighLightColor(Color.rgb(244,117,177)); set.setValueTextColor(Color.WHITE); set.setValueTextSize(10f); return set; } private LineDataSet createSet2(){ LineDataSet set2 = new LineDataSet(null, "O2"); set2.setDrawCubic(true); set2.setCubicIntensity(0.2f); set2.setAxisDependency(YAxis.AxisDependency.LEFT); set2.setColor(Color.RED); set2.setLineWidth(2f); set2.setCircleRadius(2f); set2.setFillAlpha(65); set2.setFillColor(Color.RED); set2.setHighLightColor(Color.rgb(244,117,177)); set2.setValueTextColor(Color.WHITE); set2.setValueTextSize(10f); return set2; } }
额外说明
- 新增
xIndexCounter全局变量,确保两个数据集的Entry都对应同一个X轴索引,数据能正确对齐; - 把X轴的空字符串改成计数器数值,方便调试时查看X轴位置,也可以换成时间戳这类有意义的值;
- 抽离
updateChart方法,统一处理图表刷新、滚动和计数器自增,避免重复代码; - 给血氧数据集补上数值颜色设置,确保显示效果统一。
内容的提问来源于stack exchange,提问作者Ultra_charge
相关产品推荐
相关产品推荐

