Intereting Posts
Обнаруживать, когда устройство Android находится в движущемся автомобиле Как определить событие Textchanged для редактирования текста? Java.io.invalidClassException при сериализации / десериализации Доступ к локальному ПК ПК с подключенного к USB-мобильному устройству Android Оптимальные примеры изображений для мобильных приложений Ошибка сборки сборки модуля Android Studio Android WebView Javascript из активов Рамочная структура, которая хорошо сочетается с круговыми ссылками в JSON Android Preview M: активность воссоздается после разрешения Можно ли получить доступ только для чтения к базе данных sqlite в apk? Как не обфускать методы интерфейса и его параметры с помощью Progaurd в android? Android: таймер обратного отсчета, например, с 10:00 до 00:00? Используя OnclickListener для TextView? Как центрировать взгляд с помощью RelativeLayout? Android OpenGL ES 2, рисовые квадраты Android SDK Manager не загружает последнюю платформу Android SDK (API 17)

Освежающие производители (ClusterItems) в Google Maps v2 для Android

Я использую Google API Android API Utility Library, и я загружаю определенные изображения из Интернета, которые я хочу использовать в качестве маркеров. То, как я это делаю, похоже на следующий фрагмент:

class MarkerItemClusterRenderer extends DefaultClusterRenderer<MarkerItem> { ... @Override protected void onBeforeClusterItemRendered(MarkerItem item, final MarkerOptions markerOptions) { super.onBeforeClusterItemRendered(item, markerOptions); mImageLoader.get(item.getImageUrl(), new ImageListener() { @Override public void onErrorResponse(VolleyError error) { Log.i("XXX", error.toString()); } @Override public void onResponse(ImageContainer response, boolean isImmediate) { if (response != null && response.getBitmap() != null) { mImageIcon.setImageBitmap(response.getBitmap()); Bitmap icon = mIconGenerator.makeIcon(); Bitmap bhalfsize = Bitmap.createScaledBitmap(icon, 150, 150, false); markerOptions.icon(BitmapDescriptorFactory .fromBitmap(bhalfsize)); } } }); } 

Проблема заключается в том, что при загрузке изображения карта (и, следовательно, маркер) не обновляется, поэтому большую часть времени (но не всегда) я все еще вижу красные маркеры по умолчанию.

Я попытался сделать mImageIcon.invalidate(); mImageIcon.requestLayout(); mImageIcon.invalidate(); mImageIcon.requestLayout(); Но до сих пор нет удачи.

Так или иначе, чтобы достичь этого? Заранее большое спасибо.

Solutions Collecting From Web of "Освежающие производители (ClusterItems) в Google Maps v2 для Android"

Вам просто нужно сделать все это в

 protected void onClusterItemRendered(T clusterItem, Marker marker) { ... } 

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

Вот почему вам нужно сделать это в onClusterItemRendered

Допустим, у вас есть объект GoogleMap, объявленный как: privateMapMapMapMap;

В методе onResponse () перед применением какого-либо изменения маркера попробуйте написать следующую инструкцию для удаления предыдущих маркеров: mMap.clear ();

Теперь установите новый маркер.

Возможно, я немного опоздал, но я его записываю, поэтому он может быть полезен для тех, кто ищет решение, подобное мне. В основном вам нужно обновить маркер, а не ClusterItem , но я использовал свою собственную реализацию ClusterItem для хранения важных данных. Таким образом, ваш код внутри onBeforeClusterItemRendered будет onBeforeClusterItemRendered следующим образом:

 LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds; //take visible region on map if(bounds.contains(item.getPosition()) && !item.hasImage()) { //if item is not inside that region or it has an image already don't load his image mImageLoader.get(item.getImageUrl(), new ImageListener() { @Override public void onErrorResponse(VolleyError error) { Log.i("XXX", error.toString()); } @Override public void onResponse(ImageContainer response, boolean isImmediate) { if (response != null && response.getBitmap() != null) { mImageIcon.setImageBitmap(response.getBitmap()); Bitmap icon = mIconGenerator.makeIcon(); Bitmap bhalfsize = Bitmap.createScaledBitmap(icon, 150, 150, false); //Set has image flag item.setHasImage(true); //Find the right marker MarkerManager.Collection markerCollection = mClusterManager.getMarkerCollection(); Collection<Marker> markers = markerCollection.getMarkers(); for (Marker m : markers) { if (id.equals(m.getTitle())) { //set the icon m.setIcon(BitmapDescriptorFactory.fromBitmap(image)); break; } } } } }); } 

И ваш класс MyItem должен иметь некоторые параметры, которые полезны для запоминания наших вещей:

 public class MyItem implements ClusterItem { private String itemId; private LatLng mPosition; private WMWall wall; private boolean hasImage = false; public MyItem(double latitude, double longitude) { mPosition = new LatLng(latitude, longitude); } @Override public LatLng getPosition() { return mPosition; } public WMWall getWall() { return wall; } public void setWall(WMWall wall) { this.wall = wall; } public String getItemId() { return itemId; } public void setItemId(String itemId) { this.itemId = itemId; } public boolean hasImage() { return hasImage; } public void setHasImage(boolean hasImage) { this.hasImage = hasImage; } } 

Очень важно загружать только изображения маркеров, содержащихся в границах, иначе вы столкнетесь с OOM. И если метод hasImage() возвращает true, нам не нужно снова загружать изображение, так как оно уже хранится в объекте-маркере.