【问题标题】:How can I retrieve data from my Firebase Database to display markers?如何从 Firebase 数据库中检索数据以显示标记?
【发布时间】:2019-05-09 17:28:08
【问题描述】:

我正在尝试从我的 Firebase 数据库中检索纬度和经度,但我在执行此操作时遇到了困难。正如您在屏幕截图下看到的那样,每张照片都有自己的 ID,并附加到用户 ID。我想在带有标记的地图上显示数据库中的所有位置。附件是我的代码和我的数据库的屏幕截图。

数据库截图:

编辑:我按要求添加了更多代码。

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener, GoogleMap.OnMarkerClickListener {
    private GoogleMap mMap;
    private ChildEventListener mChildEventListener;
    private DatabaseReference mUsersDataRef;
    private DatabaseReference mPhotosDataRef;

    private Map<String, User> mUsers = new HashMap<>(); //Map<(String) user-id, (User) user>
    private List<Photo> mPhotos = new ArrayList<>();

    private boolean usersFetched;
    private boolean photosFetched;

    private String photo_id;
    Marker marker;

第 2 部分


    @Override

    protected void onCreate(Bundle savedInstanceState) {
        FirebaseApp.initializeApp(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        ChildEventListener mChildEventListener;


        mUsersDataRef = FirebaseDatabase.getInstance().getReference("photo_id");
        mPhotosDataRef = FirebaseDatabase.getInstance().getReference("users");
        mUsersDataRef.push().setValue(marker);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        googleMap.setOnMarkerClickListener(this);
        googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        mPhotosDataRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot s : dataSnapshot.getChildren()) {
                    User user = s.getValue(User.class);
                    mUsers.put(user.getUser_id(), user);
                }
                usersFetched = true;
                doneLoading();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        mPhotosDataRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot s : dataSnapshot.getChildren()) {
                    Photo photo = s.getValue(Photo.class);
                    mPhotos.add(photo);
                }
                photosFetched = true;
                doneLoading();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void doneLoading() {
        if (usersFetched && photosFetched) {
            for (Photo photo : mPhotos) {
                User thisPhotosUser = mUsers.get(photo.getUser_id());
LatLng location=new LatLng(user.latitude,user.longitude);
                    mMap.addMarker(new MarkerOptions().position(location).title(user.name)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));


            }
        }
    }

    //@Override
    public String getPhoto_id() {
        return photo_id;
    }
}

【问题讨论】:

  • 请分享更多代码,包括您正在使用的参考。
  • 嗨,第一次使用stackoverflow。无论如何我可以分享我的代码或编辑我的帖子吗?
  • 是的,标签下方有一个编辑按钮。
  • 签出this
  • 这就是我所做的:``` public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot ds : dataSnapshot.getChildren()) { Marker marker = ds.getValue(Marker.class); LatLng latLng = new LatLng(marker.latitude(),marker.getLongitude()); mMap.addMarker(new MarkerOptions().position(latLng)); } } ```

标签: java android firebase google-maps-markers


【解决方案1】:

尝试使用数据快照。代码可以这样修改:

    if (usersFetched && photosFetched) {
        for (Photo photo : mPhotos) {
            User thisPhotosUser = mUsers.get(photo.getUser_id());

            thisPhotoUser.addListenerForSingleValueEvent(new ValueEvent Listner()){

                public void onDataChange(DataSnapshot datasnapshot){
                    for(Datasnapshot photos : dataSnapshot.getChildren()){

                        if(photos.child(thisPhotoUser.exists())){

                             LatLng location = new LatLng(mPhotosDataRef.child(getPhoto_id(isChild(latitude))),user.longitude);
            mMap.addMarker(newMarkerOptions().position(location).title(photo.name)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));


                        }

                    }            


                }   

            }  

        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2016-06-23
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多