Firebase Android onDataChange不会调用

时间:2016-12-13 16:18:48

标签: android firebase firebase-realtime-database

我尝试做的是从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);
}

1 个答案:

答案 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);