我正在尝试在Firebase数据库中的表中获取特定列的总和,以在Android应用程序中生成值的平均值(与当前读数形成对比)。作为测试,我想在测试应用程序的TextView中显示该总和。当我第一次声明addValueEventListener时:
reff.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot snapshot2: snapshot.getChildren()){
sum = sum + snapshot2.child("age").getValue(Integer.class);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
然后调用数据库setValue()并在onClickListener中设置textView,这可以按预期工作。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
reff.child(String.valueOf(maxid+1)).setValue(member);
Toast.makeText(MainActivity.this, "data inserted successfully", Toast.LENGTH_LONG).show();
a.setText(String.valueOf(sum));
}
});
最终,在我的应用程序中,我不希望通过单击按钮触发“总和”值。我希望它可以显示出来,以便可以将新数据与数据库中的滚动平均值进行比较。如果将上面的代码从OnClickListener移到我的主要onCreate方法中,sum的值保持为0。读取各种线程时,我还用addValueEventListener()替换了addListenerForSingleValueEvent(),但这没有影响。
有人能提出一种我可以重新设置格式的方法而不必依靠按下按钮来获取表中总和的方法吗?
对的调用a.setText()
必须在内部onDataChange
,因为当更新的数据来自数据库时,这是保证执行的唯一代码。
所以:
reff.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot snapshot2: snapshot.getChildren()){
sum = sum + snapshot2.child("age").getValue(Integer.class);
}
a.setText(String.valueOf(sum));
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
throw error.toException();
}
});
另外:请永远留下onCancelled
空荡荡的,你忽略潜在的错误那样,。
另请参见:getContactsFromFirebase()方法返回一个空列表,我将作为一个重复说明关闭您的问题-我也想向您展示代码中的相关解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句