android - 删除旧地图标记并在集群管理器中加载新标记
问题描述
我有一个谷歌地图,我想做的是使用geoQuery每15秒刷新一次firebase中的标记,这意味着我删除所有以前的标记并使用这种方法添加新的标记:
private void downloadExtraPrinters(LatLng viewCenter, int viewRadius) {
try {
final GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(viewCenter.latitude,viewCenter.longitude), viewRadius);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
try{
MyItem myItem = new MyItem(location.latitude, location.longitude);
if (!items.contains(myItem)) {
items.add(myItem);
}
}catch (ClassCastException e){
}
}
@Override
public void onKeyExited(String key) {
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
parseJsonToList();
}
@Override
public void onGeoQueryError(DatabaseError error) {
}
});
}catch (NullPointerException e){
}
}
parseJsonToList 方法:
private void parseJsonToList() {
itemss = clusterManagerAlgorithm.getItems();
try {
items.removeAll(itemss);
}catch (IndexOutOfBoundsException e){
Log.d("itemsDoesn't exist"," : ");
}
mClusterManager.clearItems(); // I Think the problem is in this 3 lines of code.
mClusterManager.cluster(); // I also tried addItems(items) before clustering i still getting the same problem.
mClusterManager.addItems(items);
}
我的问题是,每次我想清理和重新加载数据时,所有标记都会消失 15 秒,直到下一次调用 parseJsonToList 方法时,所有标记都会在 15 秒后再次出现。
@Override
protected void onStart() {
super.onStart();
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Log.d("timer","executed");
if (viewCenter != null) {
downloadExtraPrinters(viewCenter, viewRadius);
Log.d("download","newData");
}
}
}, 0, 15000); // all data reloaded every 15s.
}
这是 myItem 类:
public class MyItem implements ClusterItem {
private final LatLng mPosition;
public MyItem(double lat, double lng) {
mPosition = new LatLng(lat, lng);
}
@Override
public LatLng getPosition() {
return mPosition;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyItem item = (MyItem) o;
return Objects.equals(mPosition, item.mPosition);
}
@Override
public int hashCode() {
return Objects.hash(mPosition);
}
}
我想要的是立即更改标记而不会消失 15 秒。我在这个问题上苦苦挣扎了 2 周,请帮忙!
解决方案
假设 clusterManager 最初是空的,并且初始地理查询返回单个结果 A。
在进入 时parseJsonToList
,items
其中有一个条目 (A) 和这一行:
itemss = clusterManagerAlgorithm.getItems();
返回一个空Collection
。
既然itemss
是空的那么
items.removeAll(itemss);
没有任何效果,其余代码会将 A 添加到地图中。
现在,15 秒后返回相同的结果 (A),这一行
itemss = clusterManagerAlgorithm.getItems();
返回一个集合,其中一个项目等同于 A(按位置(等于)),现在
items.removeAll(itemss);
将删除当前结果(A),因为它也在itemss
(再次equals
使用位置)。
因此,当您添加items
此行时:
mClusterManager.addItems(items);
没有添加任何内容,因为items
它是空的。
所以这种模式很可能是..
the marker appears
15 seconds later the marker disappears
15 seconds later the marker appears
我不能推荐一个解决方案,因为我不明白为什么clearItems
最后 - 如果你真的想这样做,那么就完全摆脱“删除”逻辑。并且文档确实建议在添加后强制集群。
推荐阅读
- mysql - 比较两个 mySQl 模式
- php - 如何为一个指向两个不同域的 Laravel 应用程序设置不同的语言环境?
- python - 如何区分特定设备与多个串行 COM 端口?
- vim - Coc-Prettier 没有选择项目或家庭配置
- javascript - 从给定坐标(x,y)计算边界框的宽度和高度
- c# - 从 xml childnotes 获取数据到 listview
- laravel - 使用 Laravel 中的关系根据第二个表中的条件获取关联记录
- reactjs - 在将 React 应用程序转换为 Preact 期间面临的问题
- node.js - 更新多个对象时如何提高 MongoDb 性能
- python - Sympy 表达式的评估不会产生正确的结果