安卓谷歌地图集群项目标记与动态图像URL - 覆盖所有标记的URL。

问题描述 投票:1回答:1

在我的应用中,地图上有群集,TopMain群集标记显示总标记数,点击后显示所有子群集项标记。

在集群项中(子集群标记)显示不同颜色的圆形背景,并在其间显示来自URL的图像(从Web服务响应中获取),集群项正确显示图像,但我的问题是,在刷新最后一个响应后,图像URL覆盖所有标记图像,意味着所有集群项显示相同的图像而不是不同的图像。

我的代码如下。

      private class RenderClusterInfoWindow extends DefaultClusterRenderer<ModelClusterBikeList> {

    private final IconGenerator mClusterIconGenerator = new IconGenerator(getActivity());
    private final IconGenerator iconGenerator = new IconGenerator(getActivity());
    ImageView imageView;
    int markerWidth;
    int markerHeight;
    private DisplayImageOptions options;

    RenderClusterInfoWindow(Activity context, GoogleMap map, ClusterManager<ModelClusterBikeList> clusterManager) {
        super(context, map, clusterManager);

        // Main inflate view it show number data available inside cluster
        View multiProfile = getLayoutInflater().inflate(R.layout.inflate_cluster, null);
        mClusterIconGenerator.setContentView(multiProfile);

        markerWidth = (int) context.getResources().getDimension(R.dimen.custom_profile_image);
        markerHeight = (int) context.getResources().getDimension(R.dimen.custom_profile_image);

        // inflator its show image from the response url. (cluster item)
        View clusterITEM = getLayoutInflater().inflate(R.layout.inflate_cluster_item, null);
        iconGenerator.setContentView(clusterITEM);
        imageView = clusterITEM.findViewById(R.id.imageClusterPIN);


        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(markerWidth, markerHeight);
        layoutParams.gravity = Gravity.CENTER;
        imageView.setLayoutParams(layoutParams);


        ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(getActivity()));

        options = new DisplayImageOptions.Builder()
                .showImageForEmptyUri(R.mipmap.image_icn)
                .showImageOnFail(R.mipmap.image_icn)
                .cacheInMemory(false)
                .cacheOnDisk(true)
                .considerExifParams(true)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .build();
    }

    @Override
    protected boolean shouldRenderAsCluster(Cluster<ModelClusterBikeList> cluster) {

        if (getActivity() != null) {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (googleMap.getCameraPosition().zoom > 19.0) {
                        setClusterSize = 2;
                    } else {
                        setClusterSize = 4;
                    }
                }
            });
        }

        if (setClusterSize == 2) {
            return cluster.getSize() > cluster.getSize();
        } else {
            return cluster.getSize() > setClusterSize;
        }

    }

    @Override
    protected void onClusterRendered(Cluster<ModelClusterBikeList> cluster, Marker marker) {
        super.onClusterRendered(cluster, marker);
    }

    @Override
    protected void onBeforeClusterItemRendered(ModelClusterBikeList item, MarkerOptions markerOptions) {


        iconGenerator.setBackground(
                ContextCompat.getDrawable(getActivity(), R.drawable.round_asset));


        ImageLoader.getInstance().displayImage(item.getAssets_img_url(), imageView, options);

        // Issue is here , overwrite image url here with all marker./cluster item.
        Bitmap icon = iconGenerator.makeIcon(item.getAssets_img_url());
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));

        markerOptions.title(item.getId());
        markerOptions.draggable(true);

        super.onBeforeClusterItemRendered(item, markerOptions);
    }

    @Override
    protected void onBeforeClusterRendered(Cluster<ModelClusterBikeList> cluster, MarkerOptions markerOptions) {

        mClusterIconGenerator.setBackground(null);
        Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));

    }

    @Override
    protected void onClusterItemRendered(ModelClusterBikeList clusterItem, Marker marker) {
        super.onClusterItemRendered(clusterItem, marker);
    }
}

我也尝试把所有的代码 "onBeforeClusterItemRendered" 变成 onClusterItemRendered 但得到的结果是一样的,同样的覆盖最后一个url,所有cluter项。

android google-maps markerclusterer
1个回答
1
投票

你好 @Topsy 按照下面的代码修改一下就可以了。

首先用以下代码替换onBeforeClusterItemRendered方法。

   @Override
   protected void onBeforeClusterItemRendered(ModelClusterBikeList item, MarkerOptions 
   markerOptions) {

        icon = iconGenerator.makeIcon();
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)).
                                                      title(item.getAssets_img_url());

        markerOptions.title(item.getId());
        markerOptions.draggable(true);

        super.onBeforeClusterItemRendered(item, markerOptions);
   }

然后用下面的代码替换onClusterItemRendered方法。

   @Override
   protected void onClusterItemRendered(ModelClusterBikeList clusterItem, Marker 
   marker) {


     if (getActivity() != null) {

         Glide.with(getActivity())
              .asBitmap()
              .load(clusterItem.getAssets_img_url())
              .error(R.drawable.ic_launcher)
              .diskCacheStrategy(DiskCacheStrategy.ALL)
              .into(new CustomTarget<Bitmap>() {
               @Override
               public void onResourceReady(@NonNull Bitmap resource, @Nullable 
               Transition<? super Bitmap> transition) {

                   try {
                      if (googleMap != null) {

                            iconGenerator.setBackground(
                            ContextCompat.getDrawable(getActivity(), 
                                                        R.drawable.round_asset));

                            imageView.setImageBitmap(resource);
                            imageView.buildDrawingCache();
                            Bitmap icon = iconGenerator.makeIcon();
                             if (icon != null) {
                             marker.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
                           }
                         }
                     } catch (Exception e) {
                              e.printStackTrace();
                      }
                 }

                @Override
                public void onLoadCleared(@Nullable Drawable placeholder) {
                }
            });
          }

      }
© www.soinside.com 2019 - 2024. All rights reserved.