【问题标题】:I want to display all markers of the locations for all the users in the Firebase database to android studio我想将 Firebase 数据库中所有用户的所有位置标记显示到 android studio
【发布时间】:2018-01-30 19:10:04
【问题描述】:

正如标题所说,我是 android 新手。我正在尝试通过我在 android studio 中的地图上的标记显示所有用户的位置。问题是,只有我的 Firebase 数据库的最后一个用户是唯一显示的用户标记。我想显示所有用户的所有标记。

这是我从 Firebase 数据库中获取所有用户(标记)的代码

public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        refDatabase = FirebaseDatabase.getInstance().getReference().child("users");

        refDatabase.orderByChild("availability").equalTo("yes").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if (dataSnapshot.exists()) {
                    for(DataSnapshot ds : dataSnapshot.getChildren()) {
                        //LatLng newLocation = new LatLng(
                        // ds.child("latitude").getValue(Double.class),
                        //ds.child("longtitude").getValue(Double.class));

                        UserInformation userInfo = ds.getValue(UserInformation.class);

                        if(userInfo.getExerciseType().equals(uExerciseType)){
                            double mylat = userInfo.getLatitude();
                            double mylong = userInfo.getLongtitude();

                            String exTitle = ds.child("exerciseType").getValue(String.class);

                            LatLng newLocation = new LatLng(mylat, mylong);

                            Log.d("New Location: ", newLocation.toString());

                            //refreshes the map
                            mMap.clear();

                            MarkerOptions markerOptions = new MarkerOptions();
                            markerOptions.position(newLocation);
                            markerOptions.title(exTitle);
                            markerOptions.visible(false);

                            Marker locationMarker = mMap.addMarker(markerOptions);

                            LatLng myLatLang = new LatLng(uLatt, uLongt);
                            Log.d("My Location: ", myLatLang.toString());

                            if (SphericalUtil.computeDistanceBetween(myLatLang, locationMarker.getPosition()) < 1000000) {
                                locationMarker.setVisible(true);
                            }

                            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myLatLang, 10.2f));

                        }
                    }
                }
            }

然后,我的 Firebase 数据库如下所示:

【问题讨论】:

  • 顺便说一句,我已经使用过这个解决方案,但仍然没有用。 stackoverflow.com/questions/43635994/…stackoverflow.com/questions/45747796/…
  • 为什么不使用 for(DatasnapShot ds : --- ) 来获取所有用户?
  • 我正在使用它,它会获取所有用户,但问题是只有最后一个用户会显示在我的地图上。我希望显示所有用户
  • 请不要在您的问题中编辑答案。如果您找到了答案,您应该将其作为答案发布在下方,然后将其标记为“已接受”。

标签: android google-maps firebase-realtime-database


【解决方案1】:

要获取所有用户的位置标记,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            double latitude = ds.child("latitude").getValue(Double.class);
            double longitude = ds.child("longitude").getValue(Double.class);
            Log.d("TAG", latitude + " / " +  longitude);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(eventListener);

或者使用 UserInformation 类可以做到这一点:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            UserInformation userInfo = ds.getValue(UserInformation.class);
            double latitude = userInfo.getLatitude();
            double longitude = userInfo.getLongtitude();
            Log.d("TAG", latitude + " / " +  longitude);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(eventListener);

【讨论】:

  • 我已经从 firebase 数据库中获取了所有用户的所有位置。问题是只有最后一个用户位置是地图上显示的唯一标记。
  • 因为你的if(userInfo.getExerciseType().equals(uExerciseType))。它正在显示最后一个,但您要显示哪一个?
  • 这个条件很好,我仍然可以根据这个条件获得我想要的用户的所有位置。即使我删除了 if 条件,我仍然遇到同样的问题。问题是它没有在我的地图上将所有这些都显示为标记。
  • 这是由于这种情况而发生的。尝试发表评论,您会看到所有这些标记。
  • 我已经尝试将其注释掉,它仍然只显示来自 firebase 数据库的最终用户。我要显示的信息是具有“是”可用性的用户和与当前用户相同的练习类型,我可以根据上面的代码获取所有这些数据。问题是它没有将所有这些都显示为地图上的标记,唯一显示的用户是我根据我的条件获得的任何用户位置的最后一个用户。
【解决方案2】:

此代码适合初学者以及如何将 LatLng 转换为字符串。

/* Start from "onMapReady" */

@Override
public void onMapReady(GoogleMap googleMap) { ......



    map = googleMap;
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    map.getUiSettings().setZoomControlsEnabled(true);
    map.getUiSettings().setCompassEnabled(true);
    //Disable Map Toolbar:
    //map.getUiSettings().setMapToolbarEnabled(false);

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference usersRef = rootRef
            .child("users");

    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for(DataSnapshot ds : dataSnapshot.getChildren()) {

 //Toast.makeText(L_Location_Activity.this,"for",Toast.LENGTH_LONG).show();

                String latitude_Display = ds
                        .child("latitude")
                        .getValue().toString();

                String longitude_Display = ds
                        .child("longitude")
                        .getValue().toString();


                String latLng = latitude_Display;
                String latLng1 = longitude_Display;


                double latitude = Double.parseDouble(latLng);
                double longitude = Double.parseDouble(latLng1);

               // map.clear();
                LatLng currentLocation = new LatLng( latitude, longitude );
                MarkerOptions markerOptions = new MarkerOptions();
                markerOptions.position( currentLocation );
                //markerOptions.title("i'm here");
                //map.addMarker( markerOptions );
                map.addMarker(new MarkerOptions()
                        .position(new LatLng(latitude, longitude))
                        .title("Hello world"));
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    usersRef.addListenerForSingleValueEvent(eventListener);

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2018-12-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多