Как сделать изменяемый ItemizedOverlay - PullRequest
2 голосов
/ 16 января 2010

Я бы хотел наложить на карту Google сменные пины. Простой способ визуализировать это - подумать о наложении почти в реальном времени, где контакты постоянно меняют местоположение.

Однако я не могу придумать безопасного способа сделать это с ItemizedOverlay . Похоже, проблема заключается в вызове заполнения - если size () вызывается каким-либо потоком карт, а затем мои данные изменяются, то результатом, когда вызов карт обращается к getItem (), может быть IndexOutOfBoundsException.

Кто-нибудь может придумать лучшее решение, чем перегрузка заполнения и упаковка super.populate в синхронизированный блок?

Может, мне повезет, используя обычный оверлей? Похоже, что Itemized существует для управления данными для вас, возможно, я делаю фундаментальную ошибку, используя его?

Спасибо за любую помощь, мой мозг болит!

Hamy

Ответы [ 2 ]

3 голосов
/ 11 августа 2010

как указано в эта статья

Вам необходимо позвонить по следующей ссылке после добавления или удаления элемента из списка.

setLastFocusedIndex (-1);

Заселите ();

Пример:

@Override
protected OverlayItem createItem(int i) {
    return overlays.get(i);
}
protected void removeOverlay(OverlayItem o){
    overlays.remove(o);
    setLastFocusedIndex(-1);
    populate();
}
@Override
public int size() {
    return overlays.size();
}
public void addOverlay(OverlayItem o){
    overlays.add(o);
    setLastFocusedIndex(-1);
    populate();
}
0 голосов
/ 03 января 2011

У меня была похожая проблема, и я решил взаимно исключить (да ... синхронизировать их) метод размер и метод обновить (добавить / изменить) контакты. .. Фактически, первый был вызван пока потоком GUI, в то время как второй работает в асинхронном режиме, поэтому возможно, что они вызываются асинхронно

...