• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps Android Cluster manager marker icon depending on type

Ad621

Newbie
Im working on a small app and have implemented Google Maps and Place api. Currently im able to see all my markers on the map and clustering works fine. Im able to zoom in the clusters open up and im able to see the markers. I have a spinner that has different types and once selected that type is passed to the places search string.

This is the code I have so far

Code:
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);

        mMap = mapFragment.getMap();
        onMapReady();

        // Array of place types
        placeType = getResources().getStringArray(R.array.placeType);

        // Array of place type names
        placeTypeName = getResources().getStringArray(R.array.placeTypeName);

        // Creating an array adapter with an array of Place types
        // to populate the spinner
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, placeTypeName);

        // Getting reference to the Spinner
        spinPlaceType = (Spinner) findViewById(R.id.spinPlaceType);

        // Setting adapter on Spinner to set place types
        spinPlaceType.setAdapter(adapter);

        spinPlaceType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                int selectedPosition = spinPlaceType.getSelectedItemPosition();
                final String type = placeType[selectedPosition];

                StringBuilder sb = new StringBuilder(
                        "https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
                sb.append("location=" + myLatitude + "," + myLongitude);
                sb.append("&type=" + type);
                sb.append("&radius=4000");
                sb.append("&key=PLACES_KEY");
                // Creating a new non-ui thread task to download Google place json
                // data
                PlacesTask placesTask = new PlacesTask();

                // Invokes the "doInBackground()" method of the class PlaceTask
                placesTask.execute(sb.toString());

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                StringBuilder sb = new StringBuilder(
                        "https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
                sb.append("location=" + myLatitude + "," + myLongitude);
                sb.append("&type=restaurant");
                sb.append("&radius=4000");
                sb.append("&key=PLACES_KEY");
                // Creating a new non-ui thread task to download Google place json
                // data
                PlacesTask placesTask = new PlacesTask();

                // Invokes the "doInBackground()" method of the class PlaceTask
                placesTask.execute(sb.toString());
            }
        });


        // Will display next 20 places returned form the next_page_token
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab_more);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Finding you some more places.", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();

                StringBuilder sb = new StringBuilder(
                        "https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
                sb.append("pagetoken=" + placeJsonParser.getNext_Page_token());
                sb.append("&key=PLACES_KEY");
                // Creating a new non-ui thread task to download Google place json
                // data

                if (placeJsonParser.getNext_Page_token() == "No value for next_page_token"){
                    Snackbar.make(view, "No more places left to find.", Snackbar.LENGTH_SHORT)
                            .setAction("Action", null).show();
                }

                PlacesTask placesTask = new PlacesTask();

                // Invokes the "doInBackground()" method of the class PlaceTask
                placesTask.execute(sb.toString());
            }
        });

        mMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {
                Intent detailsIntent = new Intent(getBaseContext(), PlaceDetailsActivity.class);
                String reference = mMarker.get(marker.getId());
                marker.getPosition();
                detailsIntent.putExtra("reference", reference);
                detailsIntent.putExtra("markerLat", myLatitude);
                detailsIntent.putExtra("markerLong", myLongitude);
                startActivity(detailsIntent);
            }
        });

    }

    public void onMapReady(){
        // Enabling MyLocation in Google Map
        mMap.setMyLocationEnabled(true);
        mMap.getUiSettings().setCompassEnabled(true);
        mMap.getUiSettings().setZoomControlsEnabled(true);

        // Getting LocationManager object from System Service
        // LOCATION_SERVICE
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        // Creating a criteria object to retrieve provider
        Criteria criteria = new Criteria();

        // Getting the name of the best provider
        String provider = locationManager.getBestProvider(criteria, true);

        // Getting Current Location From GPS
        Location location = locationManager.getLastKnownLocation(provider);

        // onLocationChanged(location);
        if (location != null) {
            onLocationChanged(location);
        }
    }

    /**
     * A method to download json data from url
     */
    private String downloadUrl(String strUrl) throws IOException {
        String referer ="";
        StringBuilder jsonResults = new StringBuilder();
        HttpURLConnection conn = null;
        try {
            URL url = new URL(strUrl);

            // Creating an http connection to communicate with url
            conn = (HttpURLConnection) url.openConnection();
            if (referer != null) {
                conn.setRequestProperty("Referer", referer);
            }

            InputStreamReader in = new InputStreamReader(conn.getInputStream());

            // Load the results into a StringBuilder
            int read;
            char[] buff = new char[1024];
            while ((read = in.read(buff)) != -1) {
                jsonResults.append(buff, 0, read);
            }
            // Displays the list of places found in the terminal.
            Log.i("Data", "Places Found: " + jsonResults);
        } catch (MalformedURLException e) {
            Log.i("Google Places Utility", "Error processing Places API URL");
            return null;
        } catch (IOException e) {
            Log.i("Google Places Utility", "Error connecting to Places API");
            return null;
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
        return jsonResults.toString();

    }


    /**
     * A class, to download Google Places
     */
    private class PlacesTask extends AsyncTask<String, Integer, String> {

        String data = null;

        // Invoked by execute() method of this object
        @Override
        protected String doInBackground(String... url) {
            try {
                data = downloadUrl(url[0]);
            } catch (Exception e) {
                Log.d("Background Task", e.toString());
            }
            return data;
        }

        // Executed after the complete execution of doInBackground() method
        @Override
        protected void onPostExecute(String result) {
            ParserTask parserTask = new ParserTask();

            // Start parsing the Google places in JSON format
            // Invokes the "doInBackground()" method of the class ParseTask
            parserTask.execute(result);
        }

    }

    /**
     * A class to parse the Google Places in JSON format
     */
    private class ParserTask extends
            AsyncTask<String, Integer, List<HashMap<String, String>>> {

        JSONObject jObject;

        // Invoked by execute() method of this object
        @Override
        protected List<HashMap<String, String>> doInBackground(
                String... jsonData) {

            List<HashMap<String, String>> places = null;

            try {
                jObject = new JSONObject(jsonData[0]);

                /** Getting the parsed data as a List construct */
                places = placeJsonParser.parse(jObject);

            } catch (Exception e) {
                Log.d("Exception", e.toString());
            }
            return places;
        }

        // Executed after the complete execution of doInBackground() method
        @Override
        protected void onPostExecute(List<HashMap<String, String>> list) {

            // Clears all the existing markers
            mMap.clear();
            setUpClusterer(list);

        }
    }

    private void setUpClusterer(List<HashMap<String, String>> list) {

        HashMap<String, String> hmPlace;

        hmPlace = list.get(0);

        // Getting latitude of the place
        double lat = Double.parseDouble(hmPlace.get("lat"));

        // Getting longitude of the place
        double lng = Double.parseDouble(hmPlace.get("lng"));

        // Position the map.
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat,
                lng), 13));

        // Initialize the manager with the context and the map.
        // (Activity extends context, so we can pass 'this' in the constructor.)
        mClusterManager = new ClusterManager<MyItem>(this, mMap);

        // Point the map's listeners at the listeners implemented by the cluster
        // manager.
        mMap.setOnCameraChangeListener(mClusterManager);
        mMap.setOnMarkerClickListener(mClusterManager);

        mMap.setInfoWindowAdapter(mClusterManager.getMarkerManager());

        mMap.setOnInfoWindowClickListener(mClusterManager);
        mClusterManager.setOnClusterItemInfoWindowClickListener(this);

        mClusterManager
                .setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
                    @Override
                    public boolean onClusterItemClick(MyItem item) {
                        clickedClusterItem = item;
                        return false;
                    }
                });
        // Add cluster items (markers) to the cluster manager.
        addItems(list);

        mClusterManager.getMarkerCollection().setOnInfoWindowAdapter(
                new MyCustomAdapterForItems());
    }

    public class MyCustomAdapterForItems implements GoogleMap.InfoWindowAdapter {

        private final View myContentsView;

        MyCustomAdapterForItems() {
            myContentsView = getLayoutInflater().inflate(
                    R.layout.info_window, null);
        }
        @Override
        public View getInfoWindow(Marker marker) {

            TextView tvTitle = ((TextView) myContentsView
                    .findViewById(R.id.txtTitle));
            TextView tvSnippet = ((TextView) myContentsView
                    .findViewById(R.id.txtSnippet));

            tvTitle.setText(clickedClusterItem.getTitle());
            tvSnippet.setText(clickedClusterItem.getSnippet());

            return myContentsView;
        }

        @Override
        public View getInfoContents(Marker marker) {
            return null;
        }
    }

    private void addItems(List<HashMap<String, String>> list) {
        double latitude;
        double longitude;

        for (int i = 0; i < list.size(); i++) {
            HashMap<String, String> hmPlace = list.get(i);

            // Getting latitude of the place
            latitude = Double.parseDouble(hmPlace.get("lat"));

            // Getting longitude of the place
            longitude = Double.parseDouble(hmPlace.get("lng"));

            String name = hmPlace.get("place_name");

            // Getting vicinity
            String vicinity = hmPlace.get("vicinity");
            MyItem offsetItem = new MyItem(latitude, longitude, hmPlace.get("reference"), name, vicinity);
            mClusterManager.addItem(offsetItem);

        }
    }

    public void onClusterItemInfoWindowClick(MyItem item) {
        Intent placesIntent = new Intent(getBaseContext(), PlaceDetailsActivity.class);
        String reference = item.getReference();
        LatLng dest = item.getPosition();

        placesIntent.putExtra("name", item.getTitle());
        placesIntent.putExtra("reference", reference);
        placesIntent.putExtra("sourcelat", myLatitude);
        placesIntent.putExtra("sourcelng", myLongitude);
        startActivity(placesIntent);
    }

        @Override
    public void onLocationChanged(Location location) {
        myLatitude = location.getLatitude();
        myLongitude = location.getLongitude();
        LatLng myLocation = new LatLng(myLatitude, myLongitude);
        mMap.moveCamera(CameraUpdateFactory.newLatLng(myLocation));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(13));

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

Currently im able to see just the red markers but i was wondering if theres a way to have a different markers depending on the type selected from the spinner, For example if i select Hospital then the markers are shown as little hospital icons, if i select ATM, then a little ATM icon appears.

Any help will be appreciated
 
Back
Top Bottom