问题描述
我必须在我的应用程序群集功能中实现从服务器加载的数据。我已经使用翻新库成功地在地图上显示了数据,但是我尝试进行聚类,但无法正常工作。我在网上关注了android docs和一些教程,但对于自己做错的事情我感到非常困惑。这是我的代码:
Callback<List<Vehicle>> callback = new Callback<List<Vehicle>>() {
@Override
public void onResponse(@NotNull Call<List<Vehicle>> call,Response<List<Vehicle>> response) {
if (response.isSuccessful()) {
vehicles = response.body();
assert vehicles != null;
try {
mGoogleMap.clear();
for (int i = 0; i < vehicles.size(); i++) {
PortalMetaData MetaData = vehicles.get(i).getPortalMetaData();
float x = MetaData.getLocations().getX();
float y = MetaData.getLocations().getY();
float offset = i / 60f;
x = x + offset;
y = y + offset;
MarkerOptions markerOptions = new MarkerOptions();
LatLng latLng = new LatLng(x,y);
markerOptions.position(latLng);
markerOptions.title(MetaData.getPortalName());
markerOptions.snippet("Id: " + vehicles.get(i).getId());
mGoogleMap.addMarker(markerOptions);
cameraConfigurations(latLng);
mClusterManager = new ClusterManager<>(getApplicationContext(),mGoogleMap);
ClusterItem location = new ClusterItem(x,y);
mClusterManager.addItem(location);
CustomClusterRenderer renderer = new CustomClusterRenderer(getApplicationContext(),mGoogleMap,mClusterManager);
//mClusterManager.setAlgorithm(new NonHierarchicaldistanceBasedAlgorithm<>());
mClusterManager.setRenderer(renderer);
mClusterManager.cluster();
mGoogleMap.setonCameraIdleListener(mClusterManager);
mGoogleMap.setonMarkerClickListener(mClusterManager);
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,5.0f));
}
} catch (Exception e) {
Log.d("onResponse","There is an error");
e.printstacktrace();
}
} else {
System.out.println(response.body());
Log.e(TAG,"Error: data cannot be loaded");
}
我被调试了,一切似乎都很好。 而我的自定义渲染器就是这样:
private static final int MIN_CLUSTER_SIZE = 1;
private final IconGenerator mClusterIconGenerator;
private Context mContext;
private ClusterManager<ClusterItem> mClusterManager;
Map<Cluster<ClusterItem>,Marker> clusterMarkerMap = new HashMap<>();
public CustomClusterRenderer(Context context,GoogleMap map,ClusterManager<ClusterItem> clusterManager) {
super(context,map,clusterManager);
mContext = context;
mClusterManager = clusterManager;
mClusterIconGenerator = new IconGenerator(context);
}
@Override
protected void onBeforeClusterItemRendered(@NonNull ClusterItem item,@NonNull MarkerOptions markerOptions) {
BitmapDescriptor mBitmapDescriptor = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_magenta);
markerOptions.icon(mBitmapDescriptor);
}
@Override
protected void onClusterItemRendered(@NonNull ClusterItem clusterItem,@NonNull Marker marker) {
super.onClusterItemRendered(clusterItem,marker);
}
@SuppressLint("UseCompatLoadingForDrawables")
@Override
protected void onBeforeClusterRendered(@NonNull Cluster<ClusterItem> cluster,@NonNull MarkerOptions markerOptions) {
final Drawable mClusterIcon = mContext.getResources().getDrawable(ic_baseline_directions_car_24);
mClusterIcon.setColorFilter(mContext.getResources().getColor(android.R.color.holo_orange_light),PorterDuff.Mode.SRC_ATOP);
mClusterIconGenerator.setBackground(mClusterIcon);
if (cluster.getSize() > MIN_CLUSTER_SIZE) {
mClusterIconGenerator.setContentPadding(40,20,0);
} else {
mClusterIconGenerator.setContentPadding(30,0);
}
Bitmap mIcon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(mIcon));
}
@Override
protected boolean shouldRenderAsCluster(@NonNull Cluster<ClusterItem> cluster) {
return cluster.getSize() > MIN_CLUSTER_SIZE;
}
@Override
protected void onClusterRendered(@NonNull Cluster<ClusterItem> cluster,@NonNull Marker marker) {
super.onClusterRendered(cluster,marker);
clusterMarkerMap.put(cluster,marker);
}
有人可以给我一些有关我做错了什么或正确设置群集的好方法的建议。
编辑:最终我解决了我的问题,这是我正在做的错误。我只向集群管理器添加了一个集群项目。我创建了一个新的群集项目ArrayList,并在for循环中为每个项目添加了坐标。然后在for循环之外,我调用了clustermanager.addItems(clusteritems)并开始工作。下面是面对此问题的任何人的我的代码:
Callback<List<Vehicle>> callback = new Callback<List<Vehicle>>() {
@Override
public void onResponse(@NotNull Call<List<Vehicle>> call,Response<List<Vehicle>> response) {
if (response.isSuccessful()) {
vehicles = response.body();
assert vehicles != null;
List<ClusterItem> clusterItems = new ArrayList<>();
try {
mGoogleMap.clear();
for (int i = 0; i < vehicles.size(); i++) {
PortalMetaData MetaData = vehicles.get(i).getPortalMetaData();
float x = MetaData.getLocations().getX();
float y = MetaData.getLocations().getY();
float offset = i / 60f;
x = x + offset;
y = y + offset;
MarkerOptions markerOptions = new MarkerOptions();
LatLng latLng = new LatLng(x,y);
mClusterManager.addItem(location);
clusterItems.add(location);
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,5.0f));
}
CustomClusterRenderer renderer = new CustomClusterRenderer(getApplicationContext(),mClusterManager);
mClusterManager.addItems(clusterItems);
mClusterManager.setAlgorithm(new NonHierarchicaldistanceBasedAlgorithm<>());
mClusterManager.setRenderer(renderer);
mClusterManager.cluster();
mGoogleMap.setonCameraIdleListener(mClusterManager);
mGoogleMap.setonMarkerClickListener(mClusterManager);
} catch (Exception e) {
Log.d("onResponse","Error: data cannot be loaded");
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)