【发布时间】:2015-12-17 15:45:38
【问题描述】:
我尝试使用 Codename One 使用 Google Maps Geocoding API 进行字段文本自动填充。 我做 GoogleReverseGeocoderService 类的 here ,我将“public GoogleReverseGeocoderService(双纬度,双经度)”更改为“public GoogleReverseGeocoderService(字符串地址)”。而且效果很好。
所以我像下面的代码一样覆盖 getSuggestionModel() 和 filter(),我创建了一个变量 DefaultListModel model1,带有“model1.addItem("Example");"因为我不知道为什么如果我不添加项目,添加的新列表不会显示。
我将 addDataChangeListener 添加到 AutoCompleteTextField 变量“lieu”,在函数 dataChanged 中,我获取用户在字段中输入的文本并发送到谷歌地理编码搜索。我找到了每个“formatted_address”并将其放入模型列表 model1,因此 AutoCompleteTextField 的列表已更改。
但我有 3 个问题:
1/ 如何设置 AutoCompleteTextField 中显示的项目的大小,因为如果我添加一次,我有 2 个显示项目 model1.addItem("Example"),如果我添加 2 个,我有 4 行strong>model1.addItem("Example");,它乘以 2,以此类推……
@Override
public ListModel<String> getSuggestionModel() {
model1.addItem("Example");
filter = new FilterProxyListModel<String>(model1);
return filter;
}
2/ GoogleReverseGeocoderService 不接受用户输入的附加字符,如“élé”,我必须用“ele”录音才能得到结果。我如何编码请求?
3/ AutoCompleTextField 显示的列表有时不刷新,我必须用鼠标按下它。但也许是因为模拟器?
Louis I Ave, Marrero, LA 70072, USA 美国密苏里州圣路易斯 Louisiana Blvd NE,阿尔伯克基,新墨西哥州,美国 W Louisiana Ave, 索珀顿, GA 30457, USA Louisiana Ave S,明尼苏达州,美国 W Louisiana St, 麦金尼, TX 75069, USA S Louisiana St, Ida, LA 71044, USA N Louisiana St, Ida, LA 71044, USA 路易斯一世大道,马雷罗,LA 70072,美国 美国密苏里州圣路易斯 Louisiana Blvd NE,阿尔伯克基,新墨西哥州,美国 W Louisiana Ave, 索珀顿, GA 30457, USA Louisiana Ave S,明尼苏达州,美国 W Louisiana St, 麦金尼, TX 75069, USA S Louisiana St, Ida, LA 71044, USA N Louisiana St, Ida, LA 71044, USA
这里是所有代码:
// Define in class
protected FilterProxyListModel<String> filter;
protected DefaultListModel model1 = new DefaultListModel();
[ .... ]
//Code for google autocomplete
String locationText = "";
final AutoCompleteTextField lieu = new AutoCompleteTextField(){
private FilterProxyListModel<String> filter;
@Override
public ListModel<String> getSuggestionModel() {
model1.addItem("Example");
model1.addItem("Example");
model1.addItem("Example");
model1.addItem("Example");
model1.addItem("Example");
model1.addItem("Example");
model1.addItem("Example");
filter = new FilterProxyListModel<String>(model1);
return filter;
}
@Override
protected boolean filter(String text) {
if(filter != null) {
filter.filter(text);
return true;
}
return false;
}
};
lieu.setHint("Add address ...");
lieu.addDataChangeListener(new DataChangedListener() {
public void dataChanged(int type, int index) {
try {
Location l = Display.getInstance().getLocationManager().getCurrentLocation();
ConnectionRequest request = new GoogleReverseGeocoderService("" + lieu.getText()) {
@Override
protected void readResponse(InputStream input) throws IOException {
Result result = Result.fromContent(input, Result.JSON);
array = result.getAsStringArray("//formatted_address");
model1.removeAll(); // Remove all elements in list, before insert news
for (int i = 0; i < array.length; i++) {
System.out.println(""+array[i]);
model1.addItem(array[i]);
}
}
};
NetworkManager.getInstance().addToQueue(request);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
addComponent(lieu);
希望我清楚,有人有想法吗?
谢谢你, 再见
【问题讨论】:
-
你能澄清一下究竟是什么不起作用吗?是自动完成还是地理编码?您是否在调试器中打开它并检查值?
-
嗨 Shai,我编辑了我的问题 :)
-
反向地理编码器服务的链接是错误的,因此我更难提供帮助,因为我对那个 API 不是很熟悉。这里确实有 3 个单独的问题,因此有助于将其拆分。
标签: java codenameone google-geocoding-api