【问题标题】:Refreshing makers (ClusterItems) in Google Maps v2 for Android刷新 Google Maps v2 for Android 中的制造商 (ClusterItems)
【发布时间】:2014-03-24 13:16:18
【问题描述】:

我正在使用Google Maps Android API Utility Library,并且我正在从互联网下载某些我想用作标记的图像。 我这样做的方式就像下面的sn-p:

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();,但仍然没有成功。

有没有办法做到这一点? 提前非常感谢。

【问题讨论】:

    标签: android google-maps google-maps-markers google-maps-android-api-2 markerclusterer


    【解决方案1】:

    你只需要在

    中制作所有这些东西
    protected void onClusterItemRendered(T clusterItem, Marker marker) {
        ...
    }
    

    onBeforeClusterItemRendered 中,您在异步回调中设置MarkerOptions 上的图标。这时候可以添加到地图上,变成真实的Marker。所以你的图标将被设置为已经无用的对象。

    这就是为什么你需要在onClusterItemRendered做它

    【讨论】:

      【解决方案2】:

      假设您将 GoogleMap 对象声明为: 私有 GoogleMap mMap;

      在对标记应用任何更改之前,在 onResponse() 方法中,尝试编写以下语句以清除先前的标记: mmap.clear();

      现在设置你的新标记。

      【讨论】:

        【解决方案3】:

        我可能有点晚了,但我把它写下来,这样它对像我一样寻找解决方案的人很有用。 基本上你需要做的是刷新标记而不是ClusterItem,但我使用我自己的ClusterItem 实现来存储一些重要数据。 所以你在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,我们不需要再次加载图像,因为它已经存储到标记对象中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-25
          • 2015-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多