在此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;
}
}
答案 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...
}