1

Hey Stackoverflow-Community,senden Argument Fragment in einem Zuhörer in einer Schleife

ich auf einem Android-App für ein akademisches Projekt arbeite, das Ziel Daten ist eine API zum Abrufen verwenden und es auf einer Karte angezeigt werden Markern .

Ich möchte einige Details in einem Fragment anzeigen, wenn der Benutzer auf den Marker klickt. Ich benutze beginTransaction und setArguments, um dies zu tun, und es funktioniert für einen Marker. Mein Problem ist, dass meine Marker in einer for-Schleife erstellt werden und ich nur die Argumente aus der letzten Iteration der Schleife abrufen kann. Hier

ist die Schleife in meinem mainActivity:

JSONObject jsonObject = new JSONObject(res); 
JSONArray results = jsonObject.getJSONArray("results"); 
for (int i = 0; i < results.length(); i++) { 
    String name = placeList.get(i).getName(); 
    double lat = placeList.get(i).getLat(); 
    double lng = placeList.get(i).getLng(); 
    map.addMarker(new MarkerOptions() 
      .position(new LatLng(lat, lng)) 
      .title()); 
// CustomOnMarkerClickListener(place) implements GoogleMap.OnMarkerClickListener 
    map.setOnMarkerClickListener(new CustomOnMarkerClickListener(place)); 
} 

Hier ist meine Gewohnheit OnMarkerClickListener

public class CustomOnMarkerClickListener implements GoogleMap.OnMarkerClickListener { 
    JSONObject place; 

    public CustomOnMarkerClickListener(JSONObject place) { 
     this.place = place; 
    } 

    @Override 
    public boolean onMarkerClick(Marker marker) { 

     InfoPanelActivity ipa = new InfoPanelActivity(); 
     FragmentManager fm = getSupportFragmentManager(); 

     Bundle args = new Bundle(); 
     args.putString("place", place.toString()); 
     ipa.setArguments(args); 

     if(findViewById(R.id.textView2) == null) { 
      fm.beginTransaction() 
        .add(R.id.info_panel_frame, ipa) 
        .commit(); 
     } else { 
      fm.beginTransaction() 
        .replace(R.id.info_panel_frame, ipa) 
        .commit(); 
     } 
     return false; 
    } 

} 

Und hier ist, wie ich das Argument in meinem Fragment

 Bundle args = getArguments(); 
     String name = args.getString("place"); 
     TextView tv = (TextView) getView().findViewById(R.id.textView2); 
     tv.setText("test: " + name); 

ich Ich habe wirklich geschätzt, wenn Sie mir helfen könnten, ich sehe wirklich nicht, wie ich dieses Problem lösen kann.

Dank

+0

Da es nur ein 'OnMarkerClickListener' auf der Karte festgelegt werden kann, benötigen Sie eine Möglichkeit zum Nachschlagen die Information über eine Markierung innerhalb Ihres Zuhörers stattdessen. Dies deutet darauf hin, dass Sie eine Methode zum Kennzeichnen eines Markers mit einem Index in JSONArray benötigen, sodass Sie beim Klicken darauf die Daten abrufen können. Wenn ich das Javadoc für "MarkerOptions" ansehe, sehe ich nichts, an das man irgendwelche benutzerdefinierten Daten anhängen könnte (dasselbe gilt für das 'Marker' -Objekt, das von' addMarker() 'zurückgegeben wurde), was mich ein wenig ratlos macht und mich dazu bringt wundern Sie sich, warum Google keine Affordance für dieses ... – Karakuri

+0

Scheint, wie die Lösung ist, Ihre eigene Datenstruktur zu verwenden, um den "Markierung" zurückzugeben, der von 'addMarker()' zu irgendwelchen Daten zurückgegeben wird, die Sie haben. Dieser Beitrag beschreibt einen solchen Ansatz: http://StackOverflow.com/a/13902666/1207921 – Karakuri

Antwort

0

Wenn Sie

map.setOnMarkerClickListener(new CustomOnMarkerClickListener(place)); 

rufen Sie den Klick-Listener Neueinstellung, nicht eine andere hinzufügen. Der Klick-Listener befindet sich auf der Karte selbst, nicht als einzelne Markierung. Am Ende der for-Schleife hat der Klick-Listener die Daten von "place" nur für die letzte Markierung. Sie müssen die Ortsdaten in jedem Marker speichern und in Ihrer onMarkerClick() -Methode darauf zugreifen.

So etwas wie ...

for (int i = 0; i < results.length(); i++) { 
String name = placeList.get(i).getName(); 
double lat = placeList.get(i).getLat(); 
double lng = placeList.get(i).getLng(); 
map.addMarker(new CustomMarkerOptions() 
     .position(new LatLng(lat, lng)) 
     .place(place) 
     .title()); 
} 

// CustomOnMarkerClickListener(place) implements GoogleMap.OnMarkerClickListener 
map.setOnMarkerClickListener(new CustomOnMarkerClickListener()); 

Dann in Ihrer Klick-Listener-Klasse ..

@Override 
public boolean onMarkerClick(Marker marker) { 
    String place = marker.place(); 
    ... 
} 
+0

'MarkerOptions' hat keine' .place() 'Methode. Sie scheinen eine Unterklasse namens 'CustomMarkerOptions' zu schreiben, aber es gibt keine Möglichkeit, ein solches Objekt abzurufen, wenn auf 'Marker' geklickt wird (und 'Marker' hat auch keine '.place() 'Methode)). – Karakuri

+0

Ich dachte, Sie könnten auch ein benutzerdefiniertes Marker-Objekt schreiben. Du könntest versuchen, die Ortsdaten in .snippet() für jetzt zu setzen –

+0

Wenn ich mich richtig erinnere, wird der Schnipseltext im Infofenster eines Markers angezeigt, also sollte nur etwas Sinnvolles für den Benutzer wirklich dorthin gehören. – Karakuri

Verwandte Themen