Codename One:文本字段文本更改时AutoCompleteTextField刷新列表

时间:2015-12-17 15:45:38

标签: java codenameone google-geocoding-api

我尝试使用Codename One使用Google Maps Geocoding API进行字段文本自动填充。 我执行GoogleReverseGeocoderServicehere,我将“公共GoogleReverseGeocoderService(双纬度,双倍经度)”更改为“public GoogleReverseGeocoderService(String address)”。它运作良好。

所以我重写了getSuggestionModel()和filter(),就像下面的代码一样,我创建了一个变量DefaultListModel model1,带有“model1.addItem(”Example“);”因为我不知道为什么如果我不添加项目,添加的新列表不会显示。

我将addDataChangeListener添加到AutoCompleteTextField变量“lieu”,在函数dataChanged中,我获取用户在该字段中输入的文本并发送到谷歌地理编码搜索。我找到每个“formatted_address”并放入模型列表 model1 ,因此AutoCompleteTextField列表已更改。

但我有3个问题:

1 /如何设置AutoCompleteTextField中显示的项目的大小,因为如果我添加一次 model1.addItem(“Example”),我有2个显示的项目,如果我添加2,则有4行< strong> model1.addItem(“Example”); ,它乘以2,依此类推......

           @Override
        public ListModel<String> getSuggestionModel() {
            model1.addItem("Example");

            filter = new FilterProxyListModel<String>(model1);
            return filter;
        }

enter image description here

2 / GoogleReverseGeocoderService不接受用户输入的加入字符,例如“élé”,我必须将“ele”用于获取som结果。我如何编码请求?

3 / AutoCompleTextField显示的列表有时不刷新,我必须用鼠标按下它。但也许是因为模拟器?

  

Louis I Ave,Marrero,LA 70072,USA   美国密苏里州圣路易斯市   Louisiana Blvd NE,Albuquerque,NM,USA   W Louisiana Ave,Soperton,GA 30457,USA   Louisiana Ave S,明尼苏达州,美国   W Louisiana St,McKinney,TX 75069,USA   S Louisiana St,Ida,LA 71044,USA   N Louisiana St,Ida,LA 71044,USA   Louis I Ave,Marrero,LA 70072,USA   美国密苏里州圣路易斯市   Louisiana Blvd NE,Albuquerque,NM,USA   W Louisiana Ave,Soperton,GA 30457,USA   Louisiana Ave S,明尼苏达州,美国   W Louisiana St,McKinney,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);

希望我清楚,有人有想法吗?

谢谢你, 再见

1 个答案:

答案 0 :(得分:0)

上面的代码使用数据更改的侦听器来进行过滤,它不应该这样做,因为过滤器调整模型大小为时已晚。

您应该在filter方法本身内执行此操作,因为这是应该进行过滤的位置,这是放大列表对话框大小的位置。手动修改模型时,不会调整整个列表的大小。

要使编码正常工作,您应该使用接受具有正确编码的Reader(可能是UTF-8)的结果版本来使其正常工作。