Google Maps Marker OnInfoWindowClickListener MySql

T

theAydinator

Neues Mitglied
0
Guten Morgen,

ich habe folgendes Problem:
Ich versuche eine App zu schreiben, dass beim Betätigen der InfoWindows eines Markers die jeweilige location_id (aus der Datenbank) an die LocationDetails Activity übersenden wird.

Habe das Problem, dass immer die letzte ID übergeben wird.

Code:
void createMarkersFromJson(String json) throws JSONException {

        JSONArray jsonArray = new JSONArray(json);
        System.out.print(json);
        List<Marker> markers = new ArrayList<Marker>();

        for (int i = 0; i < jsonArray.length(); i++) {

            JSONObject jsonObj = jsonArray.getJSONObject(i);
            
            String location_id = jsonObj.getString("location_id");
            
            System.out.print(jsonObj.getJSONArray("latlng"));
            Marker marker = mapB.addMarker(new MarkerOptions()
                .title(jsonObj.getString("organization"))
                .position(new LatLng(
                        jsonObj.getJSONArray("latlng").getDouble(0),
                        jsonObj.getJSONArray("latlng").getDouble(1)))
                .snippet(jsonObj.getString("location"))
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.marker))
            );
            markers.add(marker);
            
            LocationDetails(location_id);
        }
    }
    
    public void LocationDetails(final String location_id) {
    
        mapB.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {
                Intent intent = new Intent(MainActivity.this, LocationDetail.class);
                   
                intent.putExtra("location_id", location_id);
                
                startActivity(intent);
                
                //push from bottom to top
                overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out);
            }
        });
    
    }

Wenn ich aus der Methode LocationDetails den Typ "final" entferne, bekomme ich die Meldung:
Cannot refer to a non-final variable location_id inside an inner class defined in a different method

Ich würde mich über hilfreiche Tipps sehr freuen.

Grüße
Aydin
 
Wäre ganz nett, wenn jemand mir da helfen würde.
Danke
 
Du rufst für jeden Marker einzeln "LocationDetails(location_id)" auf und instanzierst dort bzgl. der Karte immer einen neuen(!) OnInfoWindowClickListener. Der InfoWindowClickListener gilt jedoch global für alle(!) Marker.

Also (ich weiß nicht wie ichs verständlich erkläre, ich hoffe es macht bei dir Klick): Deine Karte kann nur exakt einen(!) InfoWindowClickListener haben. Du überschreibst also mit jedem Aufruf von "LocationDetails(location_id)" den zuvor gesetzten Listener. D.h. dein letztes Item aus der Liste bestimmt "location_id".

Da man an Marker (ohne Library) keine Info anhängen kann, so habs ich vor längerer Zeit mal gelöst, häng die ID mit ins Snippet (also bspw. "ID + Trennwort + eigentlicher Inhalt") rein. Die Methode die das Snippet anzeigt überschreibst du, kannst anhand des Trennwortes bestimmen, was Inhalt ist und was ID (entsprechend nur den Inhalt ausgeben). Und beim OnInfoWindowClickListener kriegst du ja auch das Snippet und kannst es wieder trennen. Diesmal aber die ID rausziehen und in den Intent packen.

Alternativ Referenzen auf die Marker in einer Liste halten mitsamt der dazugehörigen ID. Bspw. Map<Marker, int> (int ist dann deine ID). Entsprechend wenn "Marker x" geklickt wird, holst du dir die dazugehörige ID aus deiner Map.
 
  • Danke
Reaktionen: theAydinator

Ähnliche Themen

R
Antworten
3
Aufrufe
1.666
Ritartet
R
M
  • markusk73
Antworten
3
Aufrufe
865
swa00
swa00
B
Antworten
0
Aufrufe
693
basementmedia
B
Zurück
Oben Unten