如何在实现Filterable接口的AutocompleteTextView中获取建议之前等待用户停止输入?

时间:2014-12-01 12:13:41

标签: java android interface autocomplete google-places-api

在此tutorial中,Google已让AutoCompleteTextView的列表适配器实施Filterable接口,以根据下面给出的代码获取使用Google Places API的地点的自动完成建议。

有人可以帮助我了解Filterable接口的实现如何工作以及何时调用getFilter()方法?

在同一个教程中,Google建议在获取自动完成建议之前等待用户暂停输入。我们如何在以下实现中实现这一目标?我看到一些Stack Overflow帖子扩展了AutoCompleteTextView以使自动完成等待,但是它是否也可以通过Filterable接口实现?

感谢您为我澄清这一点!

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    AutoCompleteTextView autoCompView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
    autoCompView.setAdapter(new PlacesAutoCompleteAdapter(this, R.layout.list_item));
    …
}

private class PlacesAutoCompleteAdapter extends ArrayAdapter<String>
        implements Filterable {
    …
    @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;
    }
}

1 个答案:

答案 0 :(得分:0)

- &gt;我们也可以使用EditText对象以及&#39; TextWatcher&#39;

来实现这一目标
    EditText searchText = (EditText) findViewById(R.id.searchText);
    searchText.addTextChangedListener(new TextWatcher(){

        @Override
        public void afterTextChanged(Editable arg0) {
            // Do nothing
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // Do nothing
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            adapter.getFilter().filter(s);
        }

注意:filter()会在内部调用&#39; performFiltering()&#39;从这个博客获取整个解释和代码:here

- &gt; AutoCompleteTextView为我们完成工作并抽象出所有编码复杂性。如果您看一下它的代码,那么在输入TextView中输入最少数量的字符后,您将在下面的部分调用performFiltering()。

void doAfterTextChanged() {
 //....Some code...
    if (enoughToFilter()) {
        if (mFilter != null) {
            mPopupCanBeUpdated = true;
            performFiltering(getText(), mLastKeyCode);
        }
    }
  //...Some code...
}