【问题标题】:How to get autocomplete results only when user enters text如何仅在用户输入文本时获得自动完成结果
【发布时间】:2016-03-12 03:26:15
【问题描述】:

这听起来很容易,但对我来说很难。我有一个显示用户位置地址的自动完成文本视图。如果用户输入的位置不是他们的位置,我还实现了一个位置 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) {

            }
        });

然后,当我这样设置适配器时,我会检查布尔值是否为真:

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;
        }
    }

【问题讨论】:

  • 不需要TextWatcherOnItemClickListener,由AutoCompleteTextView完成,您只需向适配器提供过滤数据
  • @pskink 我正在实现 AutocompleteTextView 类的 TextWatcher 和 OnItemClickListener 接口。我不明白你的意思。
  • 看我的回答here
  • 你现在知道怎么用了吗?
  • @pskink 不是。我设法通过将布尔值传递给适配器类的构造函数来阻止它显示建议。但是,当从 onTextchanged 中传递 true 时,我的应用程序会因为 adpater 类的 getCount 方法而崩溃。如果您能给我一个提示,我将不胜感激。谢谢

标签: android autocomplete


【解决方案1】:

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

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
            }
        });

希望对你有帮助

【讨论】:

  • 我正在使用一个自定义适配器类。你的意思是重构那个类。我现在将发布该代码,以便您了解我是如何做到的。
【解决方案2】:

我会建议你只是将它重构为像这里这样的方法

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
 }

【讨论】:

  • 这完全隐藏了 acotocomple 文本视图。如果我注释掉隐藏部分,我输入文本后不会得到结果。
猜你喜欢
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
相关资源
最近更新 更多