Android Studio使用GraphView绘制Firebase实时折线图仅显点无连线问题求助
问题根因
你的问题出在每次Firebase数据更新回调时都重新创建了折线序列(LineGraphSeries)和重设图表配置,逻辑错误如下:
- 每次
onDataChange触发时都新实例化一个LineGraphSeries对象,每个序列仅包含当前回调拿到的1个数据点,单个点自然无法绘制连线 - 每次回调都重复调用
graph.addSeries(series),相当于图表里有N个仅含1个点的折线序列,最终视觉上只有散落的数据点 - 冗余重复执行图表初始化配置,没必要每次数据更新都重新设置缩放、坐标轴边界等参数
修复方案
将折线序列、图表实例作为Activity的全局成员变量,仅在onCreate时初始化一次图表配置,每次Firebase数据更新时仅往同一个已存在的折线序列中追加数据点即可。
修复后代码参考:
// 定义为Activity全局成员变量,不要放在onDataChange内部 private GraphView graph; private LineGraphSeries<DataPoint> series; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.id.your_layout_name); // 替换为你自己的布局名 // 图表初始化逻辑仅执行一次 graph = findViewById(R.id.graph); series = new LineGraphSeries<>(); graph.addSeries(series); // 图表配置仅执行一次 graph.getViewport().setScalable(true); graph.getViewport().setScalableY(true); graph.getViewport().setYAxisBoundsManual(true); graph.getViewport().setXAxisBoundsManual(true); series.setThickness(8); Viewport viewport = graph.getViewport(); viewport.setMinY(0); viewport.setMinX(0); viewport.setScrollable(true); viewport.setScalable(true); series.setDrawBackground(true); series.setColor(Color.rgb(117,53,173)); series.setDataPointsRadius(5); series.setAnimated(false); series.setDrawDataPoints(true); series.setDrawAsPath(true); GridLabelRenderer gridLabel = graph.getGridLabelRenderer(); // Firebase监听仅处理数据追加逻辑 myRef_1.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { String value = snapshot.getValue(String.class); textView.setText(value); double numValue = Double.parseDouble(value); DataPoint point = new DataPoint(2 * numValue, numValue); // 直接向全局唯一的折线序列追加数据 series.appendData(point, true, 10); } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(MainActivity.this, "Nu s-a reusit extragerea datelor din baza de date", Toast.LENGTH_SHORT).show(); } }); }
内容的提问来源于stack exchange,提问作者Grigoras Cosmin
相关产品推荐
相关产品推荐

