【问题标题】:Android Line ChartAndroid 折线图
【发布时间】:2020-05-09 12:16:42
【问题描述】:

我正在尝试使用来自 Firebase 实时数据库的数据在 Android 中制作折线图。

这是数据库的结构:

enter image description here

这是代码:

public class TemperaturaActivity extends AppCompatActivity {

    private LineChart Temp_linechart;
    ArrayList<Entry> yData;
    ValueEventListener valueEventListener;
    DatabaseReference mPostReference;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_temperatura);
        Temp_linechart = (LineChart) findViewById(R.id.linechart1);

        mPostReference = FirebaseDatabase.getInstance().getReference("dht");
        mPostReference.addValueEventListener(valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                yData = new ArrayList<>();
                float i = 0;
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    i = i + 1;
                    String SV = ds.child("temp").getValue().toString();
                    Float SensorValue = Float.parseFloat(SV);
                    yData.add(new Entry(i, SensorValue));
                }
                final LineDataSet lineDataSet = new LineDataSet(yData, "Temp");
                lineDataSet.setLineWidth(4);
                LineData lineData = new LineData(lineDataSet);
                Temp_linechart.clear();
                Temp_linechart.setData(lineData);
                //Temp_linechart.notifyDataSetChanged();
                Temp_linechart.invalidate();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}

我的折线图中没有收到任何数据,我不知道为什么。

【问题讨论】:

标签: java android firebase firebase-realtime-database linechart


【解决方案1】:

要获取temp属性的值,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference dhtRef = rootRef.child("sensor").child("dht");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            double temp = ds.child("temp").getValue(Double.class);
            Log.d("TAG", name);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
    }
};
dhtRef.addListenerForSingleValueEvent(valueEventListener);

logcat 中的结果将是temp 属性的值:

32.7
32.7
32.7

我不熟悉那个折线图库,但现在有了这些值,你可以用它们做任何你想做的事情。

附:始终添加对引用中存在的所有节点的调用,包括对.child("sensor") 的调用。

【讨论】:

  • 如何绘制当前日期和时间而不是变量 i?
  • 我在任何这些节点中都看不到任何 Timestamp 属性。所以恐怕我没有理解这个问题。除此之外,您更有可能建议使用自己的 MCVE 发布新问题,以便我和其他 Firebase 开发人员可以帮助您。