我尝试做的是从Firebase获取用户ID列表,然后从每个用户获取数据。我遇到的问题是,虽然我很乐意检索ID列表,但它似乎无法正常工作 - 此查询的onDataChange
永远不会到达。
我尝试修改configurePage
中的代码,删除for循环,甚至硬编码ID值,但无论我做什么,都不会添加到listOfItems
,但仍然无法访问{ {1}}。 onDataChange
中的日志行显示了正确的ID数量,因此我可以排除第一个查询未及时完成第二个查询。
首先查询:
configurePage
第二次查询:
public void getIDs() {
spinner.setVisibility(View.VISIBLE);
search = mDatabase.child("linked_users").child(userID);
val = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG, "Test:" + dataSnapshot.getChildrenCount());
for (DataSnapshot singleChild : dataSnapshot.getChildren()) {
listOfIDs.add(singleChild.getKey());
}
if (listOfIDs.size() == 0) {
spinner.setVisibility(View.GONE);
noResultsLabel.setVisibility(View.VISIBLE);
countLabel.setVisibility(View.GONE);
} else {
countLabel.setText("Total users: " + listOfIDs.size());
countLabel.setVisibility(View.VISIBLE);
configurePage();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "DB problem");
AlertDialog.Builder dialog = new AlertDialog.Builder(AgentViewUsers.this);
dialog = databaseDialog(dialog);
dialog.show();
}
};
search.addListenerForSingleValueEvent(val);
}
答案 0 :(得分:2)
您所看到的是预期的行为。 Firebase(与大多数现代云API一样)以异步方式加载和更新服务器中的数据。因此,当您致电addListenerForSingleValueEvent
时,启动同步数据。但是直到(可能很久)之后它才能完成。
因此,在处理Firebase时,您应该有不同的想法。而不是编码"首先获取数据,然后用该数据更新列表视图",将代码重新编码为"每当我们获得数据时,我们用该数据更新列表视图"。
在这种重新构建的方法中,您希望从onDataChange()
方法中更新列表视图。为此,您可以拨打adapter.notifyDataSetChanged()
:
Log.d(TAG, "test = " + listOfIDs.size());
for (String id : listOfIDs){
mDatabase.child("users").child(id).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
AgentUserViewObject obj = new AgentUserViewObject();
obj.name = dataSnapshot.child("full_name").getValue().toString();
obj.address = dataSnapshot.child("address").getValue().toString() + ", " + dataSnapshot.child("towncounty").getValue().toString() + ", " + dataSnapshot.child("postcode").getValue().toString();
obj.requestCount = Integer.parseInt(dataSnapshot.child("requests_submitted").getValue().toString());
listOfItems.add(obj);
mAdapter.notifyDataSetChanged(); // tell the adapter to redraw the view
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
mLayoutManager = new LinearLayoutManager(AgentViewUsers.this);
mAdapter = new AgentUserViewAdapter(listOfItems);
mRecyclerView.addItemDecoration(new DividerItemDecoration(AgentViewUsers.this,DividerItemDecoration.VERTICAL_LIST));
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
spinner.setVisibility(View.GONE);