在GWT/Java中的SuggestBox中建议地址

Geo*_*rev 3 gwt google-app-engine google-maps gwt-rpc

我想定义一个SuggestBox,其行为类似于Google地图中的搜索栏:当您开始输入时,会出现以输入字母开头的真实地址.

我想,我需要使用Geocoder.getLocations(String address,LocationCallback回调)方法,但我不知道如何将它与oracle连接,这是建议框所需要的,以产生它的建议.

你能否告诉我如何将getLocations方法与SuggestOracle

Geo*_*rev 8

我通过实现SuggestBox它自己的子类来解决这个问题SuggestOracle.AddressOracle作为Google Maps Service的Wrapper 的交易,GeocoderGoogle Maps API for GWT中的类提供了抽象.

所以这是我的解决方案:

首先,我们使用Google Maps建议实现SuggestBox的Widget

public class GoogleMapsSuggestBox extends SuggestBox {
    public GoogleMapsSuggestBox() {
        super(new AddressOracle());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们实现了SuggestOracle,它包装了Geocoder异步方法抽象:

class AddressOracle extends SuggestOracle {

    // this instance is needed, to call the getLocations-Service
    private final Geocoder geocoder;


    public AddressOracle() {
        geocoder = new Geocoder();
    }

    @Override
    public void requestSuggestions(final Request request,
            final Callback callback) {
        // this is the string, the user has typed so far
        String addressQuery = request.getQuery();
        // look up for suggestions, only if at least 2 letters have been typed
        if (addressQuery.length() > 2) {    
            geocoder.getLocations(addressQuery, new LocationCallback() {

                @Override
                public void onFailure(int statusCode) {
                    // do nothing
                }

                @Override
                public void onSuccess(JsArray<Placemark> places) {
                    // create an oracle response from the places, found by the
                    // getLocations-Service
                    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);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

这是oracle建议的一个特殊类,它只代表一个带有传递地址的String.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过在-class 的onModuleLoad()-method中编写以下行将新窗口小部件绑定到您的网页中EntryPoint:

RootPanel.get("hm-map").add(new GoogleMapsSuggestBox());
Run Code Online (Sandbox Code Playgroud)