Отображение данных из Firebase в пользовательском информационном окне

# #java #android #firebase #google-maps #firebase-realtime-database

Вопрос:

Я пытаюсь отобразить пару пользовательских данных из Firebase в пользовательском маркере карты после того, как данные о местоположении будут извлечены из базы данных, но я не знаю, следует ли мне реализовать FirebaseRecyclerAdapter или обычный. Как мне это сделать?

Я пытаюсь, по крайней мере, получить имя пользователя, тип чрезвычайной ситуации и уровень предупреждения и отобразить его в информационном окне при нажатии на маркер:

 {  "Blocked Users" : {  "RCX2HZXIwlSmMHFgDytf1DgZBgi2" : 0,  "vqP3H4maEfQxCBHEWqsH9q4O1M52" : 0  },  "User Location" : {  "RCX2HZXIwlSmMHFgDytf1DgZBgi2" : {  "latitude" : 15.506605,  "longitude" : 120.86838  },  "vqP3H4maEfQxCBHEWqsH9q4O1M52" : {  "latitude" : 37.3259633,  "longitude" : -121.898475  }  },  "Users" : {  "RCX2HZXIwlSmMHFgDytf1DgZBgi2" : {  "Alert Level" : "High",  "Emergency Type" : "Natural Disaster",  "address" : "Lapaz Tarlac",  "emergencyNum" : "0981232387346",  "name" : "Rafael Campos",  "phoneNum" : "0981233445675"  },  "vqP3H4maEfQxCBHEWqsH9q4O1M52" : {  "Alert Level" : "High",  "Emergency Type" : "Natural Disaster",  "address" : "Lapaz Tarlac",  "emergencyNum" : "9876876650987",  "name" : "Rafael Campos",  "phoneNum" : "089098786876"  }  } } 

Вот мой onMapReady():

 @Override  public void onMapReady(@NonNull GoogleMap googleMap) {  mMap = googleMap;   DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();  DatabaseReference locationRef = rootRef.child("User Location");     locationRef.addChildEventListener(new ChildEventListener() {  @Override  public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {    LocationSend send = snapshot.getValue(LocationSend.class);  LatLng location = new LatLng(send.getLatitude(), send.getLongitude());  mMap.addMarker(new MarkerOptions().position(location).title(getCompleteAddress(send.getLatitude(), send.getLongitude())));  mMap.moveCamera(CameraUpdateFactory.newLatLng(location));  mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 14F));  mMap.setInfoWindowAdapter(new InfoWindowAdapter(Retrieve.this));  Log.d("TAG", "latitude, longitude");  notification();  }   @Override  public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {  LocationSend send = snapshot.getValue(LocationSend.class);  notification();  }   @Override  public void onChildRemoved(@NonNull DataSnapshot snapshot) {   }   @Override  public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {   }   @Override  public void onCancelled(@NonNull DatabaseError error) {   }  });  }  

Мой адаптер:

 public class InfoWindowAdapter implements GoogleMap.InfoWindowAdapter{   Context context;  public InfoWindowAdapter(Context context){  this.context = context;  }   @Nullable  @Override  public View getInfoWindow(@NonNull Marker marker) {  View infoView = LayoutInflater.from(context).inflate(R.layout.infowindow, null);  TextView title = infoView.findViewById(R.id.title);  TextView alert = infoView.findViewById(R.id.alert);  TextView type = infoView.findViewById(R.id.type);  title.setText(marker.getTitle());  alert.setText(marker.getSnippet());  type.setText(marker.getSnippet());   return infoView;  }   @Nullable  @Override  public View getInfoContents(@NonNull Marker marker) {  return null;  } }  

Комментарии:

1. Не могли бы вы, пожалуйста, указать точные данные, которые вы хотите получить?

2. В узле Пользователи укажите Имя, Тип чрезвычайной ситуации и Уровень предупреждения

Ответ №1:

Согласно вашему последнему комментарию:

В узле Пользователи укажите Имя, Тип чрезвычайной ситуации и Уровень предупреждения

Чтобы получить значения указанных полей, соответствующие конкретному пользователю, и добавить их на карту Google, пожалуйста, используйте следующие строки кода:

 String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference userLocationRef = rootRef.child("User Location").child(uid); userLocationRef.get().addOnCompleteListener(new OnCompleteListenerlt;DataSnapshotgt;() {  @Override  public void onComplete(@NonNull Tasklt;DataSnapshotgt; userLocationTask) {  if (userLocationTask.isSuccessful()) {  DataSnapshot userLocationSnapshot = userLocationTask.getResult();  double latitude = userLocationSnapshot.child("latitude").getValue(Double.class);  double longitude = userLocationSnapshot.child("longitude").getValue(Double.class);   DatabaseReference uidRef = rootRef.child("Users").child(uid);  uidRef.get().addOnCompleteListener(new OnCompleteListenerlt;DataSnapshotgt;() {  @Override  public void onComplete(@NonNull Tasklt;DataSnapshotgt; userTask) {  if (userTask.isSuccessful()) {  DataSnapshot userSnapshot = userTask.getResult();  String name = userSnapshot.child("Name").getValue(String.class);  String emergencyType = userSnapshot.child("Emergency Type").getValue(String.class);  String alertLevel = userSnapshot.child("Alert Level").getValue(String.class);   MarkerOptions markerOptions = new MarkerOptions();  LatLng latLng = new LatLng(latitude, longitude);  markerOptions.position(latLng);  markerOptions.title(name   "/"   emergencyType   "/"   alertLevel);  googleMap.addMarker(markerOptions);  } else {  Log.d("TAG", userTask.getException().getMessage()); //Don't ignore potential errors!  }  }  });  } else {  Log.d("TAG", userLocationTask.getException().getMessage()); //Don't ignore potential errors!  }  } });  

Результатом следующего кода будет добавление маркера, соответствующего местоположению пользователя на карте Google. Заголовок маркера будет содержать название, тип чрезвычайной ситуации и уровень предупреждения.

Это действительно будет работать для одного пользователя, если вам нужно показать всех пользователей, то просто просмотрите объект DataSnapshot, используя метод getChildren (), подобный этому:

 String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference userLocationRef = rootRef.child(uid).child("User Location"); userLocationRef.get().addOnCompleteListener(new OnCompleteListenerlt;DataSnapshotgt;() {  @Override  public void onComplete(@NonNull Tasklt;DataSnapshotgt; userLocationTask) {  if (userLocationTask.isSuccessful()) {  for (DataSnapshot userLocationSnapshot : userLocationTask.getResult().getChildren()) {  double latitude = userLocationSnapshot.child("latitude").getValue(Double.class);  double longitude = userLocationSnapshot.child("longitude").getValue(Double.class);   DatabaseReference usersRef = rootRef.child("Users").child(uid);  usersRef.get().addOnCompleteListener(new OnCompleteListenerlt;DataSnapshotgt;() {  @Override  public void onComplete(@NonNull Tasklt;DataSnapshotgt; userTask) {  if (userTask.isSuccessful()) {  for (DataSnapshot userSnapshot : userTask.getResult().getChildren()) {  String name = userSnapshot.child("name").getValue(String.class);  String emergencyType = userSnapshot.child("Emergency Type").getValue(String.class);  String alertLevel = userSnapshot.child("Alert Level").getValue(String.class);   MarkerOptions markerOptions = new MarkerOptions();  LatLng latLng = new LatLng(latitude, longitude);  markerOptions.position(latLng);  markerOptions.title(name   "/"   emergencyType   "/"   alertLevel);  googleMap.addMarker(markerOptions);  }  } else {  Log.d("TAG", userTask.getException().getMessage()); //Don't ignore potential errors!  }  }  });  }  } else {  Log.d("TAG", userLocationTask.getException().getMessage()); //Don't ignore potential errors!  }  } });