Android 尽管从Firebase添加了项目,ArrayList大小仍然为零
我有下面的代码,应该从Firebase读取数据并将其添加到数组列表NameList和addressList中。我在onDataChange事件中记录了这些值。logcat显示数据实际上是读取的,但当我迭代列表时,它的大小为零。有谁能帮我解决这个问题吗Android 尽管从Firebase添加了项目,ArrayList大小仍然为零,android,firebase,firebase-realtime-database,arraylist,Android,Firebase,Firebase Realtime Database,Arraylist,我有下面的代码,应该从Firebase读取数据并将其添加到数组列表NameList和addressList中。我在onDataChange事件中记录了这些值。logcat显示数据实际上是读取的,但当我迭代列表时,它的大小为零。有谁能帮我解决这个问题吗 @Override public void onStart() { super.onStart(); activeOrders = FirebaseDatabase.getInstance().getReference().ch
@Override
public void onStart() {
super.onStart();
activeOrders = FirebaseDatabase.getInstance().getReference().child("Ordered Items");
activeOrders.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot child: snapshot.getChildren())
{
key = child.getKey().toString();
name = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("name");
address = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("shippingAddr");
name.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Log.i("Username", snapshot.getValue().toString());
namesList.add(snapshot.getValue().toString());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
address.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Log.i("Address", snapshot.getValue().toString());
addressList.add(snapshot.getValue().toString());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
Toast.makeText(this, "Size:" + namesList.size(), Toast.LENGTH_SHORT).show();
for(int i=0; i<namesList.size(); i++){
Toast.makeText(this, namesList.get(i).toString(), Toast.LENGTH_SHORT).show();
}
logout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
signOutUser();
}
});
@覆盖
public void onStart(){
super.onStart();
activeOrders=FirebaseDatabase.getInstance().getReference().child(“有序项”);
activeOrders.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
对于(DataSnapshot子项:snapshot.getChildren())
{
key=child.getKey().toString();
name=FirebaseDatabase.getInstance().getReference().child(“用户”).child(键).child(“名称”);
address=FirebaseDatabase.getInstance().getReference().child(“用户”).child(键).child(“shippingAddr”);
name.addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
Log.i(“用户名”,snapshot.getValue().toString());
添加(snapshot.getValue().toString());
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
Log.i(“地址”,snapshot.getValue().toString());
address.add(snapshot.getValue().toString());
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
}
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
Toast.makeText(这个,“Size:+namesList.Size(),Toast.LENGTH_SHORT).show();
对于(int i=0;i您正在主线程中迭代列表,而实际列表需要一些时间才能从firebase返回,这是因为所有firebase回调都在后台线程中运行
因此,下面的代码在实际数据到达之前在主线程中运行
for(int i=0; i<namesList.size(); i++){
Toast.makeText(this, namesList.get(i).toString(), Toast.LENGTH_SHORT).show();
}
要解决这个问题,您可以如下所示转移迭代
activeOrders.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot child: snapshot.getChildren())
{
key = child.getKey().toString();
name = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("name");
address = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("shippingAddr");
name.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Log.i("Username", snapshot.getValue().toString());
namesList.add(snapshot.getValue().toString());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
address.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Log.i("Address", snapshot.getValue().toString());
addressList.add(snapshot.getValue().toString());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
for(int i=0; i<namesList.size(); i++){
Toast.makeText(this, namesList.get(i).toString(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
activeOrders.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
对于(DataSnapshot子项:snapshot.getChildren())
{
key=child.getKey().toString();
name=FirebaseDatabase.getInstance().getReference().child(“用户”).child(键).child(“名称”);
address=FirebaseDatabase.getInstance().getReference().child(“用户”).child(键).child(“shippingAddr”);
name.addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
Log.i(“用户名”,snapshot.getValue().toString());
添加(snapshot.getValue().toString());
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
Log.i(“地址”,snapshot.getValue().toString());
address.add(snapshot.getValue().toString());
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
}
对于(int i=0;i请编辑问题,以显示您期望此代码执行的与您期望的不同的操作。它还应显示您尝试查询的数据。如果看不到数据,我们将无法知道查询是否有意义。
activeOrders.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot child: snapshot.getChildren())
{
key = child.getKey().toString();
name = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("name");
address = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("shippingAddr");
name.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Log.i("Username", snapshot.getValue().toString());
namesList.add(snapshot.getValue().toString());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
address.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Log.i("Address", snapshot.getValue().toString());
addressList.add(snapshot.getValue().toString());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
for(int i=0; i<namesList.size(); i++){
Toast.makeText(this, namesList.get(i).toString(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});