You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MPAndroidChart折线图中途停止更新新数据问题求助

看起来你遇到的问题主要是X轴数据不同步和数据集Entry索引不匹配导致的,MPAndroidChart对X轴数量与每个数据集的Entry数量一致性要求很高,当两者不匹配时就会出现数据停止显示、图表空掉的情况。我帮你梳理下代码里的几个关键问题,再给出修复后的完整代码:

问题分析

  1. X轴数据重复添加:
    你在addEntry和addO2Entry里都调用了data.addXValue(""),这会导致X轴的条目数是两个数据集Entry总数的总和,而每个数据集的Entry数量只占一半,当图表滚动时,后面的X轴没有对应的Entry数据,就会显示为空。

  2. Entry的X索引错误:
    创建Entry时用了set.getEntryCount()作为X索引,比如心率数据集的Entry索引是自己的计数,血氧数据集也是自己的计数,但X轴的索引是全局的,这会导致两个数据集的Entry对应到不同的X轴位置,最终数据无法正确对齐,甚至超出X轴范围后消失。

  3. 图表滚动逻辑不统一:
    只有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:37:33