使用Java中从Firebase Firestore提取的数据创建饼图

使用Java中从Firebase Firestore提取的数据创建饼图,java,android,firebase,google-cloud-firestore,pie-chart,Java,Android,Firebase,Google Cloud Firestore,Pie Chart,我希望使用存储在Firebase Firestore中的数据创建一个饼图。我目前正在使用MPAndroidChart库,我已经使用了静态ArrayList ArrayList<PieEntry> hours = new ArrayList<>(); hours.add(new PieEntry(2, "Professional")); hours.add(new PieEntry(1, "Self-Directed&quo

我希望使用存储在Firebase Firestore中的数据创建一个饼图。我目前正在使用MPAndroidChart库,我已经使用了静态ArrayList

 ArrayList<PieEntry> hours = new ArrayList<>();

    hours.add(new PieEntry(2, "Professional"));
    hours.add(new PieEntry(1, "Self-Directed"));
    hours.add(new PieEntry(5, "Work-Based Learning"));
    hours.add(new PieEntry(2, "Other"));
ArrayList小时数=新建ArrayList();
增加(新条目(2,“专业”);
增加(新条目(1,“自导”);
增加(新条目(5,“基于工作的学习”);
增加(新条目(2,“其他”);
饼图静态数据示例

我希望我的饼图显示每种活动类型完成的总小时/分钟数(如图所示)

我的数据是这样组织的

到目前为止,我已经能够使用以下代码提取总小时数,日志显示了预期的答案

CollectionReference cpdHours = fStore.collection("cpdActivities")
            .document(user.getUid())
            .collection("myCPD");

    cpdHours.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()){
                  float totalHours = 0;
                for (QueryDocumentSnapshot document : task.getResult()){
                    String sHour = document.getString("Activity_Hours");
                    float xHours = Float.parseFloat(sHour);
                    totalHours += xHours;
                }
                Log.d("TAG", String.valueOf(totalHours));
            }
        }
    });
CollectionReference cpdHours=fStore.collection(“cpdActivities”)
.document(user.getUid())
.收款(“myCPD”);
cpdHours.get().addOnCompletListener(新的OnCompletListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
浮动总小时数=0;
对于(QueryDocumentSnapshot文档:task.getResult()){
String sHour=document.getString(“活动时间”);
float xHours=float.parseFloat(sHour);
总小时数+=X小时;
}
Log.d(“TAG”,String.valueOf(totalHours));
}
}
});

是否有方法查询每个不同活动类型的数据并计算每个类型的总数,然后将此信息添加到ArrayList中?

如果您知道活动的名称,可以使用查询

CollectionReference cpdHoursSelfDirectedLearning=fStore.collection(“cpdActivities”)
.document(user.getUid())
.收款(“myCPD”);
whereEqualTo(“活动时间”、“自主学习”)

私有浮动计算时间(列表文档){
浮动总小时数=0.0;
对于(QueryDocumentSnapshot文档:task.getResult()){
String sHour=document.getString(“活动时间”);
float xHours=float.parseFloat(sHour);
总小时数+=X小时;
}
返回总小时数
}
cpdHoursSelfDirectedLearning.get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
小时。添加(
新项目(calcTime(task.getResult()),“自主学习”)
);
}
}
})

您必须为每个activityType创建一个CollectionReference(因此您必须知道activities类型)

如果您知道activities的名称,您可以使用查询

CollectionReference cpdHoursSelfDirectedLearning=fStore.collection(“cpdActivities”)
.document(user.getUid())
.收款(“myCPD”);
whereEqualTo(“活动时间”、“自主学习”)

私有浮动计算时间(列表文档){
浮动总小时数=0.0;
对于(QueryDocumentSnapshot文档:task.getResult()){
String sHour=document.getString(“活动时间”);
float xHours=float.parseFloat(sHour);
总小时数+=X小时;
}
返回总小时数
}
cpdHoursSelfDirectedLearning.get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
小时。添加(
新项目(calcTime(task.getResult()),“自主学习”)
);
}
}
})

您必须为每个activityType创建一个CollectionReference(因此您必须知道activityType)

谢谢您的帮助!我不得不对您建议的代码进行一些调整,比如在calcTime方法中,因为它不接受列表作为参数。我已经用QuerySnapshot替换了它,我可以在calcTime方法中记录totalHours,以检查它是否正常工作并且没有返回null,但是当它尝试执行hours时,我得到的结果是零;出于某种原因,它不会接受计算结果作为饼图ArrayList中的第一个参数,我不知道为什么,我刚刚添加了pieChart.notifyDataSetChanged();在我的工作时间声明之后,这已经起作用了!谢谢你的帮助谢谢你的帮助!我不得不对您建议的代码进行一些调整,比如在calcTime方法中,因为它不接受列表作为参数。我已经用QuerySnapshot替换了它,我可以在calcTime方法中记录totalHours,以检查它是否正常工作并且没有返回null,但是当它尝试执行hours时,我得到的结果是零;出于某种原因,它不会接受计算结果作为饼图ArrayList中的第一个参数,我不知道为什么,我刚刚添加了pieChart.notifyDataSetChanged();在我的工作时间声明之后,这已经起作用了!谢谢你的帮助