Update Marker when Location Change based on Value of Child Firebase Android

谁说我不能喝 提交于 2019-12-23 22:12:03

问题


I need help with Firebase database.

What I'm trying to do is to display all users from AvailableWorkers (e.g, N2GCEIGYBaRiNrFPawklx1NymF3, ruN5PaZC0WNZYm6YJrRtbQVXOoH2) on my maps.

Here's a screenshot of the Firebase Database

Here's my current code:

private void loadAllAvailableWorkers(final LatLng location) {

    //Delete markers on the map including client location and available workers
    mMap.clear();

    //After delete, add location back
    mMap.addMarker(new MarkerOptions()
            .position(location)
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_client_marker))
    );

    //Load all available Workers
    DatabaseReference dbWorkerLocation = FirebaseDatabase.getInstance().getReference(Common.available_workers_table);
    GeoFire gfWorkerLocation = new GeoFire(dbWorkerLocation);

    GeoQuery gqWorkerLocation = gfWorkerLocation.queryAtLocation(new GeoLocation(location.latitude, location.longitude), distance);
    gqWorkerLocation.removeAllListeners();
    gqWorkerLocation.addGeoQueryEventListener(new GeoQueryEventListener() {
        @Override
        public void onKeyEntered(String key, final GeoLocation location) {
            FirebaseDatabase.getInstance().getReference(Common.user_workers_table)
                    .child(key)
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            //Add plumber to the map
                            mMap.addMarker(new MarkerOptions()
                                    .position(new LatLng(location.latitude, location.longitude))
                                    .flat(true)
                                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_worker_marker))
                            );
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
        }

        @Override
        public void onKeyExited(String key) {

        }

        @Override
        public void onKeyMoved(String key, GeoLocation location) {

        }

        @Override
        public void onGeoQueryReady() {
            //Distance will search within 3km
            if(distance <= LIMIT) {

                distance++;
                loadAllAvailableWorkers(location);
            }
        }

        @Override
        public void onGeoQueryError(DatabaseError error) {

        }
    });
}

Any help would be greatly appreciated. Thank you in advance! :)


EDITED

DatabaseReference dbWorkerLocation = FirebaseDatabase.getInstance().getReference(Common.available_workers_table);

This is the part where I need to get (again) the parent of the child current user ID


回答1:


To solve this, please use the following code:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference availableWorkersRef = rootRef.child("AvailableWorkers");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
            for(DataSnapshot ds : dSnapshot.getChildren()) {
                String name = ds.child("name").getValue(String.class);
                Log.d("TAG", name);
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
availableWorkersRef.addListenerForSingleValueEvent(valueEventListener);

The output will be the names of all available workes.



来源:https://stackoverflow.com/questions/49306983/update-marker-when-location-change-based-on-value-of-child-firebase-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!