我已经使用了具有多个位置的google map标记,并且我添加了一些带有医院名称,经度和纬度的医院位置,我从firebase中检索并加载到具有医院名称的可搜索微调器中。当我单击医院名称时,将其标记为该特定位置,但是在我的代码中,所有位置均被标记,但是当我单击它转到该标记并返回到当前位置时,当我单击医院时可以怎么显示位置可搜索的微调器中的任何人的名字,请帮助我
提前感谢
This is my java code
public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback, IFirebaseLoaddone, NavigationView.OnNavigationItemSelectedListener {
private GoogleMap mMap;
double longitude, latitude;
private SearchableSpinner searchableSpinner;
DatabaseReference hospitalRef;
IFirebaseLoaddone iFirebaseLoaddone;
List<Hospital> hospitals;
private DrawerLayout drawer;
private HashMap<String, Marker> mMarkers = new HashMap<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
searchableSpinner = findViewById(R.id.searchviewid);
BubbleSeekBar bubbleSeekBar = findViewById(R.id.seekbar);
final TextView textView = findViewById(R.id.textview);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
//init Db
hospitalRef = FirebaseDatabase.getInstance().getReference("hospital");
//init interface
iFirebaseLoaddone = this;
hospitalRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<Hospital> hospital = new ArrayList<>();
for (DataSnapshot hospitalsnapshot : dataSnapshot.getChildren()) {
hospital.add(hospitalsnapshot.getValue(Hospital.class));
}
iFirebaseLoaddone.onFirebaseLoadSuccess(hospital);
}
@Override
public void onCancelled(DatabaseError databaseError) {
iFirebaseLoaddone.onFirebaseLoadFailed(databaseError.getMessage());
}
});
searchableSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
hospitalRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
setMarker(dataSnapshot);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
setMarker(dataSnapshot);
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
bubbleSeekBar.setOnProgressChangedListener(new BubbleSeekBar.OnProgressChangedListener() {
@Override
public void onProgressChanged(int progress, float progressFloat) {
//textView.setText( String.format( "on change %d",progress ) );
}
@Override
public void getProgressOnActionUp(int progress, float progressFloat) {
}
@Override
public void getProgressOnFinally(int progress, float progressFloat) {
}
});
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
latitude = getIntent().getDoubleExtra("latitude", 0);
longitude = getIntent().getDoubleExtra("longtitude", 0);
findViewById(R.id.zoomin).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMap.animateCamera(CameraUpdateFactory.zoomIn());
}
});
findViewById(R.id.zoomout).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMap.animateCamera(CameraUpdateFactory.zoomOut());
}
});
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager
.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
return;
}
mMap.setMyLocationEnabled(true);
mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()));
CameraUpdate Zoom = CameraUpdateFactory.zoomTo(16);
mMap.clear();
MarkerOptions mp = new MarkerOptions();
mp.position(new LatLng(location.getLatitude(), location.getLongitude()));
mp.title("Source");
mMap.addMarker(mp);
mMap.moveCamera(center);
mMap.animateCamera(Zoom);
}
});
}
@Override
public void onFirebaseLoadSuccess(List<Hospital> hospitalList) {
hospitals = hospitalList;
//get all data
List<String> name_list = new ArrayList<>();
List<Double> latitude = new ArrayList<>();
List<Double> longitude = new ArrayList<>();
for (Hospital hospital : hospitalList)
name_list.add(hospital.getName());
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, name_list);
searchableSpinner.setAdapter(adapter);
}
@Override
public void onFirebaseLoadFailed(String message) {
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.nav_home:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new HomeFragment()).commit();
break;
case R.id.nav_location:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new LocationFragment()).commit();
break;
case R.id.nav_setting:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new SettingFragment()).commit();
break;
case R.id.nav_logout:
logout();
break;
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
private void logout()
{
FirebaseAuth.getInstance().signOut();
Intent intent= new Intent(getApplicationContext(),LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
@Override
public void onBackPressed() {
if(drawer.isDrawerOpen(GravityCompat.START)){
drawer.closeDrawer(GravityCompat.START);
}else {
super.onBackPressed();
}
}
private void setMarker(DataSnapshot dataSnapshot){
String key = dataSnapshot.getKey();
HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();
double latitude = Double.parseDouble(value.get("latitude").toString());
double longitude = Double.parseDouble(value.get("longitude").toString());
LatLng location = new LatLng(latitude,longitude);
if(!mMarkers.containsKey(key)) {
mMarkers.put(key, mMap.addMarker(new MarkerOptions().title(key).position(location)));
}
else
{
mMarkers.get(key).setPosition(location);
}
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for(Marker marker : mMarkers.values()){
builder.include(marker.getPosition());
}
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(builder.build(),100));
}
}
我看到您的代码时,问题出在setOnMyLocationChangeListener上,因为每次gps给您更新时,您都在将地图动画化为当前位置。
删除这两行:
mMap.moveCamera(center);
mMap.animateCamera(Zoom);
它看起来像这样:
mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()));
CameraUpdate Zoom = CameraUpdateFactory.zoomTo(16);
mMap.clear();
MarkerOptions mp = new MarkerOptions();
mp.position(new LatLng(location.getLatitude(), location.getLongitude()));
mp.title("Source");
mMap.addMarker(mp);'
}
});
}
希望它将解决问题