[OFFEN] Wie kann ich mehrere Marker in eine MapView laden

P

Peter200980

Ambitioniertes Mitglied
0
Hallo Zusammen,

ich versuch gerade mehrere MapMarker in eine Karte zu laden.
Bei einem Marker funktioniert alles problemlos, doch ich weiss nicht wie ich die Schleife formulieren soll, um mehrere Marker anzuzeigen.
Anbei findet ihr meinen Code:
Code:
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    private ProgressDialog pDialog;
    private GoogleMap mMap;
    private static String url="xxxx";
    ArrayList<HashMap<String, String>> contactList;
    private String TAG = MainActivity.class.getSimpleName();
    double latitude;
    double longitude;
    String namec;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        contactList = new ArrayList<>();
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map3);
        mapFragment.getMapAsync(this);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        new GetContacts().execute();
        ImageButton locations= (ImageButton) findViewById(R.id.imagebuttonLocations);
        locations.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new GetContacts().execute();
            }
        });
    }

    private class GetContacts extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MapsActivity.this);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            HttpHandler sh = new HttpHandler();


            String jsonStr = sh.makeServiceCall(url);

            Log.e(TAG, "Response from url: " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);


                    JSONArray markers = jsonObj.getJSONArray("markers");


                    for (int i = 0; i < markers.length(); i++) {
                        JSONObject c = markers.getJSONObject(i);

                        String id = c.getString("id");
                        String name = c.getString("name");
                        String address = c.getString("address");
                        String lat = c.getString("lat");
                        String lng = c.getString("lng");




                        // tmp hash map for single contact
                        HashMap<String, String> contact = new HashMap<>();

                        // adding each child node to HashMap key => value
                        contact.put("id", id);
                        contact.put("name", name);
                        contact.put("address",address);
                        contact.put("lat", lat);
                        contact.put("lng", lng);

                        latitude = Double.parseDouble(lat); longitude = Double.parseDouble(lng);
                        contactList.add(contact);
                        namec = name;
                    }
                } catch (final JSONException e) {
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "Json parsing error: " + e.getMessage(),
                                    Toast.LENGTH_LONG)
                                    .show();
                        }
                    });

                }
            } else {
                Log.e(TAG, "Couldn't get json from server.");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Couldn't get json from server. Check LogCat for possible errors!",
                                Toast.LENGTH_LONG)
                                .show();
                    }
                });

            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();
          Toast.makeText(getApplicationContext(),"Parsing funktioniert"+latitude+longitude,Toast.LENGTH_LONG).show();

        }

    }
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        mMap.setMyLocationEnabled(true);
        LatLng a = new LatLng(20,20);
        mMap.addMarker(new MarkerOptions().position(a).title("a!"));

            LatLng P1 = new LatLng(latitude,longitude);
            mMap.addMarker(new MarkerOptions().position(1).title(namec));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(1));

    }
}
Desweiteren habe ich das Problem, wenn ich nur einen Marker anzeigen will, d.h. wenn ich nicht den Marker mit den Statischen Koordinaten setze, wird der andere Marker auf dem Äquator angezeigt, wenn ich jedoch einen statischen hinzufüge, funktioniert es wieder.
Kann sich das jemand erklären?
Danke & Schöne Grüße
Peter
 
Code:
LatLng P1 = new LatLng(latitude,longitude);
mMap.addMarker(new MarkerOptions().position(1).title(namec));
mMap.moveCamera(CameraUpdateFactory.newLatLng(1));
Statt 1 meinst du bestimmt P1.

Könnte es sein, das latitude und longitude beide 0 sind? Überprüfe das mal.
 
Hallo Markus,

ja, stimmt damit meine ich P1, ja du hast tatsächlich recht, der Marker wird bei 0,0 angezeigt, jedoch habe ich in meinem JSON andere Koordinaten.
hast du eine Idee woran das liegt?
[doublepost=1490480717,1490479788][/doublepost]Hi Markus,

lustigerweise funktioniert manchmal die Darstellung, d.h. der Marker wird manchmal an der richtigen Stelle dargestelllt manchmal jedoch auf 0,0
 
Ja, habe ich. ;)

Es ist eigentlich ganz einfach.
onMapReady() wird aufgerufen, wenn die Map geladen wurde.
Es gibt jetzt 2 Möglichkeiten:
1. Du hast bis dahin nicht den Button gedrückt. Dann sind latitude u. longitude beide 0. Primitive Datentypen wie Double werden, wenn ihnen keine explizite Werte zugewiesen wurden, einen default Wert zugewiesen. In dem Fall 0. Das gilt nur Felder.
2. Du hast vorher den Button gedrückt. Dann haben latitude u. longitude den Wert, der im Json hinterlegt wurden.

Ich hoffe, das hilft dir. Du kannst Marker auch später in der Karte einfügen.
 
Hi Markus,

ich habe keinen Button in meiner Activity ::(, deswegen verstehe ich nicht so richtig was du meinst
[doublepost=1490523303,1490523257][/doublepost]Hast du einen Lösungsansatz für mich?
 
Mit den Button meine ich den Listener, welchen du implementierst hast.
Code:
locations.setOnClickListener(new View.OnClickListener() {...}

Und den Aufruf new GetContacts().execute(); entfernst du aus onCreate(). Du weißt nämlich nicht, welche der beiden Task (AsynTask und der Thread für die Karte) zuerst fertig ist.
Statt dessen versuch mal new GetContacts().execute() in onMapReady() aufzurufen.
 
Hi Markus,

habe es nun wie folgt versucht:
Code:
 @Override
    public void onMapReady(GoogleMap googleMap) {

        mMap = googleMap;

        mMap.setMyLocationEnabled(true);
        LatLng a = new LatLng(20,20);
        mMap.addMarker(new MarkerOptions().position(a).title("a!"));
        new GetContacts().execute();
            LatLng P1 = new LatLng(latitude,longitude);
            mMap.addMarker(new MarkerOptions().position(P1).title(namec));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(P1));
Nun ist es so: Wenn ich die App starte, wird zuerst meine MapActivity ausgeführt, dann wird der Marker auf 0,0 angezeigt. Wenn ich jetzt jedoch einmal die Activity Wechsel und wieder auf meine MapActivity gehe, wird es richtig angezeigt.
 
Peter200980 schrieb:
Code:
            LatLng P1 = new LatLng(latitude,longitude);
            mMap.addMarker(new MarkerOptions().position(P1).title(namec));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(P1));
Lösche das mal aus onMapReady() und füge das in den Asynctask ein.

Code:
 @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();
          Toast.makeText(getApplicationContext(),"Parsing funktioniert"+latitude+longitude,Toast.LENGTH_LONG).show();
          
            LatLng P1 = new LatLng(latitude,longitude);
            mMap.addMarker(new MarkerOptions().position(P1).title(namec));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(P1));
        }

Grund: Die Latitude und die Longitude werden im AsyncTask berechnet. Du darfst erst den Marker setzen, nach dem der AsyncTask fertig ist.
 
Hi Markus,

yeeeah es funktioniert :).
Jetzt haben wir nur noch ein problem, nämlich wie ich die Schleife formulieren soll, damit mehrere Marker in die Map geladen werden.
 

Ähnliche Themen

OnkelLon
Antworten
13
Aufrufe
1.876
OnkelLon
OnkelLon
D
Antworten
14
Aufrufe
1.616
chrs267
chrs267
S
Antworten
7
Aufrufe
1.124
swa00
swa00
Zurück
Oben Unten