gpt4 book ai didi

android - 在 android 谷歌地图中更改 clustermanager 项目图标

转载 作者:太空狗 更新时间:2023-10-29 14:02:53 26 4
gpt4 key购买 nike

我的 Android 应用程序中有一个谷歌地图。它充满了标记,它聚集了标记……简而言之,这是一张完全可用的 map 。

我想做的很简单。当用户点击 clusterItem 时,我想将图标更改为选定的图标。 (简单地说,相同的标记但颜色不同)。

我如何在屏幕上使用大量标记,每次单击标记时都无法清理 map 并添加标记。

所以:

mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
@Override
public boolean onClusterItemClick(MyItem myItem) {
if (oldItemSelected != null) {
mClusterManager.removeItem(oldItemSelected);
oldItemSelected.setItemAsNotSelected();
mClusterManager.addItem(oldItemSelected);
}

mClusterManager.removeItem(myItem);
myItem.setItemAsSelected();
mClusterManager.addItem(myItem);
mClusterManager.cluster();

oldItemSelected = myItem;
return true;
}
});

想法是从 map 中删除点击的项目,将其设置为“已选择”,添加新项目并使用 .cluster 方法刷新 map 。

会发生什么:项目没有改变,有时项目是“重复的”并且所选项目位于“正常”项目的后面。

这是我设置集群管理器的方式:

mClusterManager = new ClusterManager<MyItem>(this, map);
mClusterManager.setRenderer(new MyItemRenderer());
mClusterManager.setAlgorithm(new GridBasedAlgorithm<MyItem>());
map.setOnMarkerClickListener(mClusterManager);

这是项目渲染器:

private class MyItemRenderer extends DefaultClusterRenderer<MyItem> {
public MyItemRenderer() {
super(getApplicationContext(), map, mClusterManager);
}

@Override
protected void onBeforeClusterItemRendered(MyItem myItem, MarkerOptions markerOptions) {
markerOptions.title(myItem.getName());
markerOptions.snippet(myItem.getAddress());
markerOptions.icon(BitmapDescriptorFactory.fromResource(myItem.getIcon()));
}

@Override
protected boolean shouldRenderAsCluster(Cluster cluster) {
return cluster.getSize() > 1;
}

public Marker getMarker(MyItem item) {
return super.getMarker(item);
}
}

有什么方法可以做到这一点而不必重新绘制 map 中的每个项目?

public class MyItem extends DefaultClusterRenderer<WifiSpotItem> {

private HashMap<Integer, Marker> markerWifiSpots = new HashMap<>();

public MyItem(Context context, GoogleMap map, ClusterManager<WifiSpotItem> mClusterManager) {
super(context, map, mClusterManager);
}

@Override
protected void onBeforeClusterItemRendered(WifiSpotItem wifiSpotItem, MarkerOptions markerOptions) {

if (markerOptions != null && wifiSpotItem != null) {
markerOptions.title(wifiSpotItem.getName() != null ? wifiSpotItem.getName() : Constants.EMPTY_STRING);
markerOptions.snippet(wifiSpotItem.getAddress() != null ? wifiSpotItem.getAddress() : Constants.EMPTY_STRING);
markerOptions.icon(BitmapDescriptorFactory.fromResource(wifiSpotItem.getIcon()));
}
}

@Override
protected void onClusterItemRendered(WifiSpotItem clusterItem, Marker marker) {
markerWifiSpots.put(clusterItem.getId(), marker);
super.onClusterItemRendered(clusterItem, marker);
}

@Override
protected boolean shouldRenderAsCluster(Cluster cluster) {
return cluster.getSize() > 4;
}

public Marker getMarker(WifiSpotItem item) {
return super.getMarker(item);
}

public Marker getMarker(int id) {
Marker item;
if (markerWifiSpots != null) {
item = markerWifiSpots.get(id);
} else {
item = null;
}
return item;
}
}

最佳答案

渲染任务似乎忽略了已经显示在屏幕上的对象。我尝试将 MyItem 对象的新实例(onClusterItemClick 方法参数的副本)添加到集群管理器,它起作用了。

mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
@Override
public boolean onClusterItemClick(MyItem myItem) {
...
mClusterManager.removeItem(myItem);
MyItem copy = myItem.copy();
copy.setItemAsSelected();
mClusterManager.addItem(copy);
mClusterManager.cluster();
...
}
});

关于android - 在 android 谷歌地图中更改 clustermanager 项目图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34393252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com