java - 代号一 : AutoCompleteTextField refresh list on textfield text change

标签 java codenameone google-geocoding-api

我尝试使用 Codename One 通过 Google map 地理编码 API 进行字段文本自动完成。 我做GoogleReverseGeocoderServicehere这样的类,我将“public GoogleReverseGeocoderService(双纬度,双经度)”更改为“public GoogleReverseGeocoderService(字符串地址)”。而且效果很好。

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

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

但我有 3 个问题:

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

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

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

enter image description here

2/GoogleReverseGeocoderService 不接受用户输入的重音字符,例如“élé”,我必须粘贴“ele”才能得到结果。我如何对请求进行编码?

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

Louis I Ave, Marrero, LA 70072, USA St Louis, MO, USA Louisiana Blvd NE, Albuquerque, NM, USA W Louisiana Ave, Soperton, GA 30457, USA Louisiana Ave S, Minnesota, USA 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 St Louis, MO, USA Louisiana Blvd NE, Albuquerque, NM, USA W Louisiana Ave, Soperton, GA 30457, USA Louisiana Ave S, Minnesota, USA 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);

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

谢谢你, 再见

最佳答案

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

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

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

关于java - 代号一 : AutoCompleteTextField refresh list on textfield text change,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34338618/

相关文章:

java - 无法使用 java 运行 First Kaa 应用程序

java - Hibernate、JDBC、Mysql、无法登录数据库

Java 8 + Hibernate 5 MySQL TIMESTAMP/DATETIME 到 LocalDateTime 映射

google-maps - 地理编码 API 超出速率限制

java - 有没有办法表达 TemporalAmount 的 "sign"?

codenameone - 如何使用 Gmail Api 在 Code Name One 上发送电子邮件

java - 在 codenameone 对话框中禁用 OK 命令

themes - 圆形和圆角矩形边框设置未保存在主题中

Android Geocoder 获取管理区域的简称

google-geocoding-api - 如何以编程方式检索多边形边界区域?