Android Firebase 等待数据

标签 android firebase firebase-realtime-database wait

在我的 Android 应用程序中,我创建了一个 Activity,其中包含一个 ListView,其中填充了来自 Firebase 数据库的数据。

数据库结构的JSON树如下:

{
  "companies" : {
    "companyX" : {
      "address" : "50th avenue, NY",
      "name" : "Spare-Tools Ltd."
    },
    "companyZ" : {
      "address" : "50th Broadway, NY",
      "name" : "Burgers and Burgers"
    }
  },
  "company-requests" : {
    "companyX" : {
      "req1" : true
      "req2" : true
    }
  },
  "requests" : {
    "req1" : {
      "destination" : "Upper Tooting 122, Bronx",
      "origin" : "Philadelphia",
      "time" : "1473593287",
      ...
    }
    "req2" : {
      ...
    }
  }
}

我想用来自 requests 节点的请求列表填充 ListView。但我首先需要知道属于特定公司的所有请求,因此我首先转到company-requests 节点并检索属于特定公司的所有请求 key 。 我面临的问题是 ListView 是在数据库的最终数据到达之前创建的:

public class RequestsListActivity extends AppCompatActivity {
    private ListView rListView;
    DatabaseReference rootNode = FirebaseDatabase.getInstance().getReference();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        rListView = (ListView) findViewById(R.id.result_list_view);
        //First I retrieve all the requests of a specific company
        DatabaseReference companyRequests = rootNode.child("company-requests/companyX");

        companyRequests.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //Then I retrieve all the keys of these requests
                ...
                while (iterator.hasNext()) {
                    String key = iterator.next().getKey();
                    //For each key I retrieve its details from the requests node
                    DatabaseReference currRequest = rootNode.child("requests/" + key);
                    currRequest.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            String time;
                            time = (String) dataSnapshot.child("time").getValue();
                            Request request = new Request(time);
                            allRequests.add(request);
                        }
                        ...onCancelled...
                    });
                }
                //THIS CODE IS EXECUTED TO EARLY: BEFORE WE HAVE ANY DATA FROM FIREBASE
                RequestAdapter adapter = new RequestAdapter(RequestsListActivity.this, allRequests);
                rListView.setAdapter(adapter);

                }

            ...onCancelled...
        });
    }
}

如何插入一个 wait(旋转器?)来等待从 Firebase 加载值?

最佳答案

您可以使用一个简单的计数器来跟踪待处理加载的数量:

companyRequests.addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
        // at the start we need to still load all children
        final long[] pendingLoadCount = { dataSnapshot.getChildrenCount() };
        for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
            //For each key I retrieve its details from the requests node
            DatabaseReference currRequest = rootNode.child("requests/" + childSnapshot.getKey());
            currRequest.addListenerForSingleValueEvent(new ValueEventListener() {
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String time;
                    time = (String) dataSnapshot.child("time").getValue();
                    Request request = new Request(time);
                    allRequests.add(request);

                    // we loaded a child, check if we're done
                    pendingLoadCount[0] = pendingLoadCount[0] - 1;
                    if (pendingLoadCount[0] == 0) {
                        RequestAdapter adapter = new RequestAdapter(RequestsListActivity.this, allRequests);
                        rListView.setAdapter(adapter);
                    }
                }
                ...onCancelled...
            });
        }
    }
});

关于Android Firebase 等待数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39477847/

相关文章:

android - Android解析XML——<description>标签解析

javafx - 如何在 javafx 中使用 firebase

Java/Android - 从 Firebase 将 ArrayList 作为对象加载时出错

javascript - 从 firebase 数据库获取数据不起作用

javascript - Firebase 数据未保存到数据库

android - exception.class.missing._Unknown_ : Strongly consider using FLAG_IMMUTABLE without PendingIntent in source

android - 如何在 Android 中制作 Home_Screen 启动器选择器?

android - 自定义状态栏 - Android

javascript - 将 documentId 存储为文档中的字段

java - Firebase 查询列表<String> "contains"值