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