在我的应用中,地图上有群集,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项。
你好 @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) {
}
});
}
}