当前位置: 首页 > 知识库问答 >
问题:

如何仅在用户输入文本时获得自动完成结果

公冶安怡
2023-03-14

这听起来很容易,但对我来说很难。我有一个显示用户位置地址的自动完成文本视图。我还实现了一个位置api,如果用户输入的不是他们的位置,则可以获取地址。一切都像预期的那样工作,但即使已经有地址,位置结果仍然显示。为了降低成本,我希望仅在用户输入地址时获得地址结果。我做了一个全局布尔值,并在文本更改时设置为true,如下所示:

autocomplete.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                isTextEntered = true;  //to get autocomplete get results only after user enters text
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

然后,在设置适配器时,检查布尔值是否为true:

if (isTextEntered) {
            autocomplete.setAdapter(new GooglePlacesAutocompleteAdapter(this, R.layout.search_results_list_item, R.id.tvSearchResultItem));
            autocomplete.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    final String selectedPlace = (String) parent.getItemAtPosition(position);
                    autocomplete.setText(selectedPlace);
                }
            });
        }

但在我的活动的oncreate方法中这样做只会阻止自动完成显示任何位置提示结果。我怎样才能在这里实现我的目标?一如既往,我们非常感谢您的帮助。

这是我的自定义适配器类:

class GooglePlacesAutocompleteAdapter extends ArrayAdapter implements Filterable {

        private ArrayList resultList;
        //private ArrayList<HashMap<String, Place>> results = new ArrayList<>();

        public GooglePlacesAutocompleteAdapter(Context context, int list, int textViewResourceId) {

            super(context, list, textViewResourceId);
        }

        @Override
        public int getCount() {
            return resultList.size();
        }

        @Override
        public String getItem(int index) {
            return resultList.get(index).toString();
        }

        //@Override
        //public HashMap<String, Place>  getItem(int index) {return results.get(index);}

        @Override
        public Filter getFilter() {
            Filter filter = new Filter() {

                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    FilterResults filterResults = new FilterResults();
                    if (constraint != null) {
                        // Retrieve the autocomplete results.
                        resultList = autocomplete(constraint.toString());
                        // Assign the data to the FilterResults
                        filterResults.values = resultList;
                        filterResults.count = resultList.size();
                    }
                    return filterResults;
                }

                @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
                    if (results != null && results.count > 0) {
                        notifyDataSetChanged();
                    } else {
                        notifyDataSetInvalidated();
                    }
                }
            };
            return filter;
        }
    }

共有2个答案

慕阳文
2023-03-14

我建议你把它重构成这样一种方法

public void setSelectedPlace() {
            autocomplete.setAdapter(new GooglePlacesAutocompleteAdapter(this, R.layout.search_results_list_item, R.id.tvSearchResultItem));
            autocomplete.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    final String selectedPlace = (String) parent.getItemAtPosition(position);
                    autocomplete.setText(selectedPlace);
                }
            });
  }

然后在类似此处的afterTextChanged方法中调用它,然后隐藏自动完成

@Override
 public void afterTextChanged(Editable s) {
     setSelectedPlace();
  // hide the autocomplete
 }
仰翔
2023-03-14

这是我实现这一目标的想法。

complete.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                  // 1. init autocomplete 
                  // 2. show autocomplete
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
               // 1. get enter text
               // 2. update the datasource of autocomplete adapter
            }

            @Override
            public void afterTextChanged(Editable s) {
               // hide the autocomplete
            }
        });

希望有帮助

 类似资料:
  • 我正在测试的网站有一个文本框来输入位置。当我输入一个字符时,Google API会在文本框下方发送与该字符匹配的位置列表。以下是自动完成选项的快照 我试图在硒中自动化这个场景。但是问题是当我textbox.sendkeys(“文本”)时,从谷歌应用编程接口填充位置列表不会发生。 我尝试过隐式和显式等待,计时器高达200秒,但仍然不起作用。我试过了,在sendkeys()之前单击(),键。在send

  • 本文向大家介绍jQuery实现用户输入自动完成功能,包括了jQuery实现用户输入自动完成功能的使用技巧和注意事项,需要的朋友参考一下 利用jQuery UI中Auto-complete插件实现输入自动完成功能,大家在使用诸如淘宝、京东等电商平台搜索商品时,往往只要输入商品的一些特殊字符,就可以显示出和该字符相近的列表菜单,用户使用鼠标或者键盘方向键就可以快速选择,实现了很好的用户体验。 1.最简

  • 问题内容: 如何从用户进行pygame打印输入: 我试图让用户键入一些内容,然后pygame将其打印在屏幕上。 这是我当前的程序: 我想要这样,当用户点击Enter时,它将清空屏幕。 帮我! 问题答案: 这是一个示例脚本,可将输入切换到屏幕。它显示了如何在遍历pygame事件队列时修改字符串。每帧都将清除屏幕,并重建名称表面并使其变白。 这是要点版本

  • 问题内容: 我尝试创建一个计算器,但由于不知道如何获得用户输入而无法使它工作。 如何获得Java中的用户输入? 问题答案: 你可以根据要求使用以下任何选项。 Scanner class BufferedReader and InputStreamReader classes DataInputStream class 该类中的方法已被弃用。若要获取值,应将先前的解决方案与一起使用 Console

  • 第一个帖子!和一个java的noob*随便! 我知道有很多关于这个话题的帖子,我已经读过了…我就是解决不了。 我有一个非常简单的HTML表单,有静态输入和动态创建的输入。 HTML自动完成 HTML表单 null AddInput.js 所以问题很简单…给定这些代码,我如何在每个新生成的输入中实现自动完成。 事先多谢。

  • 本文向大家介绍如何禁用HTML输入字段的自动完成功能?,包括了如何禁用HTML输入字段的自动完成功能?的使用技巧和注意事项,需要的朋友参考一下 例 输出结果 上面的代码将产生以下输出- 提交表单一次后在上述字段中键入内容-