Удалите старые маркеры карты и загрузите новые в диспетчере кластеров - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть карта Google, и я пытаюсь обновлять маркеры из firebase каждые 15 секунд, используя geoQuery. Это означает, что я удаляю все предыдущие маркеры и добавляю новые, используя этот метод:

private void downloadExtraPrinters(LatLng viewCenter, int viewRadius) {

    try {

        final GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(viewCenter.latitude,viewCenter.longitude), viewRadius);
        geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
            @Override
            public void onKeyEntered(String key, GeoLocation location) {

                try{
                    MyItem myItem = new MyItem(location.latitude, location.longitude);
                    if (!items.contains(myItem)) {
                        items.add(myItem);
                    }

                }catch (ClassCastException e){

                }

            }

            @Override
            public void onKeyExited(String key) {

            }

            @Override
            public void onKeyMoved(String key, GeoLocation location) {

            }

            @Override
            public void onGeoQueryReady() {

                parseJsonToList();
            }

            @Override
            public void onGeoQueryError(DatabaseError error) {

            }
        });
    }catch (NullPointerException e){

    }


}

метод parseJsonToList:

private void parseJsonToList() {


itemss = clusterManagerAlgorithm.getItems();
try {
    items.removeAll(itemss);
}catch (IndexOutOfBoundsException e){
    Log.d("itemsDoesn't exist"," : ");
}


mClusterManager.clearItems();      // I Think the problem is in this 3 lines of code.
mClusterManager.cluster();         // I also tried addItems(items) before clustering i still getting the same problem.
mClusterManager.addItems(items);

}

Моя проблема в том, что каждый раз, когда я хочу очистить и перезагрузить данные, все маркеры исчезают на 15 секунд, пока при следующем вызове метода parseJsonToList не появятся все маркерыснова через 15 секунд.

@Override
protected void onStart() {
    super.onStart();

    timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            Log.d("timer","executed");
             if (viewCenter != null) {
                downloadExtraPrinters(viewCenter, viewRadius);
                Log.d("download","newData");
            }

        }
    }, 0, 15000);  // all data reloaded every 15s.
}

Вот класс myItem:

public class MyItem implements ClusterItem {
private final LatLng mPosition;

public MyItem(double lat, double lng) {
    mPosition = new LatLng(lat, lng);
}

@Override
public LatLng getPosition() {
    return mPosition;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    MyItem item = (MyItem) o;
    return Objects.equals(mPosition, item.mPosition);
}

@Override
public int hashCode() {

    return Objects.hash(mPosition);
}
}

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

1 Ответ

0 голосов
/ 23 сентября 2018

Предположим, что clusterManager изначально пуст, а исходный гео-запрос возвращает один результат A.

При входе в parseJsonToList, items имеет одну запись (A) и эту строку:

itemss = clusterManagerAlgorithm.getItems();

возвращает пустое значение Collection.

Поскольку itemss пусто, то

items.removeAll(itemss);

не имеет никакого эффекта, а остальная часть кода добавит A на карту.

Теперь, через 15 секунд возвращается тот же результат (A), эта строка

itemss = clusterManagerAlgorithm.getItems();

возвращает коллекцию с одним элементом, эквивалентным A (по позиции (равно))и теперь

items.removeAll(itemss);

удалит текущий результат (A), потому что он также находится в itemss (снова на equals с использованием позиции).

Итак, когда вы добавляете items в этой строке:

mClusterManager.addItems(items);

ничего не добавлено, потому что items пусто.

И, таким образом, шаблон наиболее вероятен ..

the marker appears
15 seconds later the marker disappears
15 seconds later the marker appears

Я не могу рекомендовать решение, так как не могу понять, почему clearItems в конце - если вы действительно хотитечтобы сделать это, просто избавьтесь от логики «удаления».И документация действительно рекомендует форсировать кластер после добавления.

...