Codenameone 如何使属性更改侦听器在Codename One中启动
我正在尝试更新地图上的用户位置。因此,我对LocationListener的定义如下:Codenameone 如何使属性更改侦听器在Codename One中启动,codenameone,Codenameone,我正在尝试更新地图上的用户位置。因此,我对LocationListener的定义如下: public class UserLocationListener implements LocationListener { @Override public void locationUpdated(Location location) { User.getInstance().actualLocation.set(location); } @Override publi
public class UserLocationListener implements LocationListener {
@Override
public void locationUpdated(Location location) {
User.getInstance().actualLocation.set(location);
}
@Override
public void providerStateChanged(int newState) {
}
}
ActualAllocation
是以下定义的属性
在模拟器内,如果我使用位置模拟器移动用户位置,则会触发LocationUpdate
现在在我的MainForm类构造函数中,如果我添加:
User.getInstance().actualLocation.addChangeListener((p) -> {
System.err.println("User location has changed");
// Update user location on the map
}
虽然映射显示有一个标记(请参见myMap.addMarker(…)
),但它永远不会被激发
所以我的问题是:为什么这个变更监听器没有被解雇,我应该把它放在哪里才能让所有的工作都顺利进行
感谢您的帮助,位置代码重用相同的位置对象实例,只更改其中的值。属性中的
set(T)
方法仅在新值时触发更改事件=代码>旧值:
public K set(T value) {
if(this.value != value) {
this.value = value;
firePropertyChanged();
}
if(parent == null) {
// allows properties to work even if they aren't registered in the index
return null;
}
return (K)parent.parent;
}
因此,作为一种解决方法,您可以使用以下内容:
public void locationUpdated(Location location) {
Location l = new Location();
l.setLatitude(location.getLatitude());
... // etc. sucks that we don't have new Location(location)
User.getInstance().actualLocation.set(l);
}
我不确定我们需要它是否是错误的。您能验证actualallocation
的值是否已设置吗?通过调用System.println(User.getInstance().actualLocation.get())
在您的locationUpdated
。您好,谢谢您的建议。事实上,它是随着位置
而发展的,我检查过了。但是changeListener不会触发。谢谢Shai!要使其触发,我首先set(new Location())
,然后set(Location)
。这样可以避免将位置的所有字段
复制到l
中。我同意位置(Location)
会很方便!在我看来,在这种情况下使用!this.value.equals(value)
而不是this.value!=值
对于FireProperty更改是有意义的。因此,set(T值,布尔forceObjectEqualityCheck)
可能会有所帮助。这将导致事件触发两次,并可能导致“反弹”效果。由于我们正在更改基础对象,因此equals调用仍将返回true。是的,我知道触发两次的事件,因此我首先将其设置为null
,然后将其设置为location
。在propertyChangedListener
中,我检查actualLocation.get()
是否为=更新UI之前,从null
执行代码>操作。您编写了“代码重用相同的位置对象”,因此您没有更改基础对象,是吗?是的。本地实现可能会大量触发位置,因此我们会尽量减少分配。