尽管从 Firebase 添加了项目,但 ArrayList 的大小仍然为零
Posted
技术标签:
【中文标题】尽管从 Firebase 添加了项目,但 ArrayList 的大小仍然为零【英文标题】:ArrayList size remains zero despite adding items from Firebase 【发布时间】:2020-10-22 04:26:22 【问题描述】:我有以下代码应该从 Firebase 读取数据并将其添加到数组列表 namesList 和 addressList。我记录了 onDataChange 事件的值。 logcat 显示数据实际上已被读取,但是当我迭代列表时,它的大小为零。谁能帮我解决这个问题:
@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();
);
【问题讨论】:
请编辑问题以显示您期望此代码执行的操作与您期望的不同。它还应该显示您尝试查询的数据。如果没有看到数据,我们就无法知道查询是否有意义。 【参考方案1】:您正在主线程中迭代列表,而实际列表需要一些时间才能从 firebase 中返回,这是因为所有 firebase 回调都在后台线程中运行
所以,下面的代码在实际数据进来之前在主线程中运行
for(int i=0; i<namesList.size(); i++)
Toast.makeText(this, namesList.get(i).toString(), Toast.LENGTH_SHORT).show();
下面的代码在firebase后台线程中运行
public void onDataChange(@NonNull DataSnapshot snapshot)
Log.i("Username", snapshot.getValue().toString());
namesList.add(snapshot.getValue().toString());
要解决这个问题,您可以如下转移迭代
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)
);
【讨论】:
以上是关于尽管从 Firebase 添加了项目,但 ArrayList 的大小仍然为零的主要内容,如果未能解决你的问题,请参考以下文章
将数据类的对象添加到 Kotlin 的 Firestore 时如何添加 Firebase 时间戳?
尽管添加了自动布局约束,但 UIScrollView 不滚动
尽管没有引发错误,但图像似乎没有上传到 Firebase 存储