Получение маркера карты по его идентификатору в Google Maps v2
в основном при добавлении маркера на карту он возвращает новый маркер, и вы можете получить идентификатор маркера от него так
Marker m = map.addMarker(new MarkerOptions()
.position(new LatLng(lat,lon)));
String id = m.getId();
Есть ли способ получить маркер по его идентификатору, если есть много маркеров, и вы просто хотите его удалить?
Ответы
Ответ 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;
.
Просто добавьте знак в словарь каждый раз, когда вы его рисуете.