我解决了这个问题,通过实现
SuggestBox
的子类,并拥有自己的
SuggestOracle
。
AddressOracle
作为Google Maps服务的包装器,其中类
Geocoder
在Google Maps API for GWT中提供抽象化。
以下是我的解决方案:
首先,我们实现一个带有Google Maps建议的SuggestBox小部件。
public class GoogleMapsSuggestBox extends SuggestBox {
public GoogleMapsSuggestBox() {
super(new AddressOracle());
}
}
然后,我们实现了SuggestOracle,它包装了Geocoder异步方法的抽象:
class AddressOracle extends SuggestOracle {
private final Geocoder geocoder;
public AddressOracle() {
geocoder = new Geocoder();
}
@Override
public void requestSuggestions(final Request request,
final Callback callback) {
String addressQuery = request.getQuery();
if (addressQuery.length() > 2) {
geocoder.getLocations(addressQuery, new LocationCallback() {
@Override
public void onFailure(int statusCode) {
}
@Override
public void onSuccess(JsArray<Placemark> places) {
Collection<Suggestion> result = new LinkedList<Suggestion>();
for (int i = 0; i < places.length(); i++) {
String address = places.get(i).getAddress();
AddressSuggestion newSuggestion = new AddressSuggestion(
address);
result.add(newSuggestion);
}
Response response = new Response(result);
callback.onSuggestionsReady(request, response);
}
});
} else {
Response response = new Response(
Collections.<Suggestion> emptyList());
callback.onSuggestionsReady(request, response);
}
}
}
这是一个针对Oracle建议的特殊类,它只代表了一个包含交付地址的字符串。
class AddressSuggestion implements SuggestOracle.Suggestion, Serializable {
private static final long serialVersionUID = 1L;
String address;
public AddressSuggestion(String address) {
this.address = address;
}
@Override
public String getDisplayString() {
return this.address;
}
@Override
public String getReplacementString() {
return this.address;
}
}
现在,您可以通过在
EntryPoint
类的
onModuleLoad()
方法中编写以下行来将新小部件绑定到您的网页中:
RootPanel.get("hm-map").add(new GoogleMapsSuggestBox());