# #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! } } });