Фрагмент диалога для каждого маркера карты в Картах Google?

У меня есть фрагмент диалога, который открывается через InfoWindowClickListener в картах Google. Мне нужен уникальный фрагмент диалога для каждого маркера на карте. Фрагменты диалога создаются следующим образом, для каждого места, в цикле последовательно:

public PlaceMarker(Place place) {
            this.place = place;
            this.marker = map.addMarker(new MarkerOptions()
                    .position(place.getLocation())
                    .title(this.place.getName())
                    .snippet(place.getInfo()));
            mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
                @Override
                public void onInfoWindowClick(Marker marker) {
                    FragmentManager manager = getFragmentManager();
                    //restdialog = RestaurantDialog.newInstance(place);
                    RestaurantDialog restdialog = new RestaurantDialog();
                    Bundle args = new Bundle();
                    args.putSerializable("place", place);
                    restdialog.setArguments(args);
                    restdialog.setTargetFragment(DefaultMap.this, 0);
                    restdialog.show(manager, place.getName());
                }
            });
        }

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя окна с информацией о маркерах выглядят именно так, как я ожидаю (каждое место имеет свои собственные данные над ним), фрагмент диалога для каждого щелчка маркера отображается как самый последний созданный фрагмент диалога (позвольте мне знать, если это не имеет смысла). То есть, если я создам метку места для следующих мест в следующем порядке: Балтимор, Филадельфия, Вашингтон, округ Колумбия, информационные окна для Балтимора, Филадельфии и Вашингтона, округ Колумбия, будут иметь правильное информационное окно для каждого места, когда вы нажимаете на их маркеры, но при нажатии на информационное окно вы увидите только фрагмент диалога для Вашингтона, округ Колумбия, для всех 3 мест.

РЕДАКТИРОВАТЬ: я добавляю места из цикла for через этот фрагмент кода, который занимает место и создает новый ресторанный маркер для каждого места:

public void addPlace(Place place) {
    this.places.add(place); //this.places is a List<Place>
    this.markerBank.put(place, new PlaceMarker(place)); //this.markerBank is a HashMap <Place, PlaceMarker>
}

person Eric    schedule 06.12.2015    source источник


Ответы (1)


Ваша проблема в том, что вы сохраняете последнее место в переменной с именем Place с помощью этой строки:

this.place = place;

Когда ваш onInfoWindowClick срабатывает, он использует значение этой переменной. Вам нужно иметь список мест и связать каждое место с каждым маркером. Используйте для этого HashMap. Что-то типа:

HashMap<Place, Marker> myList = new HashMap<>();

Надеюсь, это поможет.

person Androiderson    schedule 06.12.2015
comment
см. обновление кода. Я уже делаю это, извините за неясность. - person Eric; 06.12.2015
comment
Вероятно, вам нужно переместить setOnInfoWindowClickListener из PlaceMarker. Он удерживает последние Place каждый раз, когда вы перебираете addPlace. - person Androiderson; 06.12.2015
comment
или мне нужно, чтобы это были места для маркеров? хотя маркеры хранятся в маркерах мест - person Eric; 06.12.2015
comment
Итак, где мне нужно добавить setoninfowindowclicklistener? или, по крайней мере, где бы вы порекомендовали попробовать? - person Eric; 06.12.2015
comment
Только один раз сразу после получения экземпляра mMap. А затем добавьте логику, чтобы получить место, соответствующее маркеру, который вам дан в onInfoWindowClick - person Androiderson; 06.12.2015
comment
в итоге это сработало после добавления еще одной хэш-карты для маркеров в идентификаторы мест. Спасибо! - person Eric; 07.12.2015