Подтвердить что ты не робот

Получение маркера карты по его идентификатору в Google Maps v2

в основном при добавлении маркера на карту он возвращает новый маркер, и вы можете получить идентификатор маркера от него так

Marker m = map.addMarker(new MarkerOptions()
                            .position(new LatLng(lat,lon)));
String id = m.getId();

Есть ли способ получить маркер по его идентификатору, если есть много маркеров, и вы просто хотите его удалить?

4b9b3361

Ответ 1

Проблема заключается в том, что идентификатор маркера генерируется автоматически и не может использоваться для отслеживания маркеров отдельно. Было предложено несколько стратегий для этого. Один из них будет использовать хэш-карту для отслеживания маркеров, а затем использовать ключ, который вы выбрали, чтобы найти специальный маркер и удалить его. Другая идея - перегрузить одно из полей маркера, например, фрагмент, а затем добавить ключ самостоятельно. Например, если вы создавали новый маркер (используя код примера Google), вы могли бы поместить свою собственную ключевую строку в поле фрагмента

mMap.addMarker(new MarkerOptions()                           
.position(MELBOURNE)                           
.title("Melbourne")                           
.snippet(KEY + "Population: 4,137,400"));

Позже вы можете извлечь этот ключ, используя

String s = marker.getSnippet()
String key = s.substring(start, end)

а затем использовать условное выражение для удаления определенного маркера, если он соответствует. В зависимости от того, что нужно сделать для одного подхода, я должен быть проще и эффективнее другого.

Ответ 2

Я сделал так:

Инициализировать переменные:

private GoogleMap mMap;
private HashMap<Marker, Integer> mHashMap = new HashMap<Marker, Integer>();
private ArrayList<MyCustomModelClass> myList = new ArrayList<MyCustomModelClass>();

Добавить маркер в карте google с помощью arraylist:

for (int i = 0; i < myList.size(); i++) {
    double latitude = myList.getLatitude();
    double longitude = myList.getLongitude();
    Marker marker = mMap.addMarker(new MarkerOptions().position(new LatLng(latitude,longitude))).title(myList.getTitle())
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.location_icon));
    mHashMap.put(marker, i);
}  

В прослушиватель кликов :

@Override
public boolean onMarkerClick(Marker marker) { 
    int pos = mHashMap.get(marker);
    Log.i("Position of arraylist", pos+"");
}

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

Ответ 3

Используйте WeakHashMap<Integer,Marker> для хранения маркеров, потому что таким образом мы не будем хранить ссылку на маркер в памяти, и вам не придется беспокоиться о марке, собранной с мусором.

Второй рекомендуемый способ сделать это - иметь WeakHashMap с идентификатором и вашими пользовательскими данными. В документации указано, что объект-маркер может измениться, поэтому не используйте маркер в качестве ключа. если активность убита и восстановлена, но идентификатор останется прежним. иногда он может возвращать значение null, если объекты маркера изменены.

WeakHashMap<Integer,Marker> obj = new WeakHashMap <Integer,Marker>();

Надеюсь, это поможет будущим зрителям...

Ответ 4

Лучший способ сделать это - использовать Map <int, Mark> dictionaryMark;.

Просто добавьте знак в словарь каждый раз, когда вы его рисуете.