如何在Google Maps android上设置多重标记?

问题描述 投票:0回答:1

我已经使用了具有多个位置的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));

    }


}

google-maps android-studio firebase-realtime-database google-maps-markers google-maps-android-api-2
1个回答
0
投票

我看到您的代码时,问题出在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);'

            }
        });
    }

希望它将解决问题

© www.soinside.com 2019 - 2024. All rights reserved.