我的布局中有一个自动填充文本框,我使用自定义适配器填充自动填充建议。
AutoCompleteTextView autocompleteView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
autocompleteView.setAdapter(new PlacesAutoCompleteAdapter(context, R.layout.autocomplete_list_item));
点击建议时,所选值将显示在Toast中。
autocompleteView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String description = (String) parent.getItemAtPosition(position);
Toast.makeText(context, description, Toast.LENGTH_SHORT).show();
}
});
这是我的自定义适配器类。 我已经标记了我的方法返回字符串列表的位置。
public class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements Filterable {
ArrayList<String> resultList;
Context mContext;
int mResource;
public PlacesAutoCompleteAdapter(Context context, int resource) {
super(context, resource);
mContext = context;
mResource = resource;
}
@Override
public int getCount() {
// Last item will be the footer
return resultList.size();
}
@Override
public String getItem(int position) {
return resultList.get(position);
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new Filter.FilterResults();
if (constraint != null) {
resultList = /##### HERE IS MY METHOD WHICH RETURNS A LIST OF STRING #####/
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;
}
}
这很好用。但我需要更改适配器,以便它返回一个二维字符串数组。
我的目的是将一组[name][ID]
对返回到自动完成框。我已经为此目的写了一堂课。
public class autoCompleteItem {
public String placeName;
public String placeID;
}
我没有返回线性字符串列表,而是修改了我的数据获取方法以返回autoCompleteItem
个对象的列表。但我无法将其绑定到我的自动填充文本框。
我想要达到的目标是:
自动填充框将仅显示placeName的autoCompleteItem对象列表中的建议。 (即建议不会显示placeID)
点击建议时,我希望在面包上显示placeID。
答案 0 :(得分:4)
使用模型的类是正确的方法。当然,您将更改Adapter
。您必须延长ArrayAdapter<autoCompleteItem>
的延伸ArrayAdapter<String>
内容。同样适用于getItem
,其必须返回autoCompleteItem
String
的内容。您还必须在ArrayList<String> resultList
中更改ArrayList<autoCompleteItem> resultList
。
由于您没有覆盖getView()
,因此请覆盖模型类中的getString并让它返回placeName
在onItemClick
中,您需要
autoCompleteItem item = (autoCompleteItem) parent.getItemAtPosition(position);
您可以通过autoCompleteItem
访问item
的成员。
小编,autoCompleteItem
应该是AutoCompleteItem
相应的java命名约定。 E.g
public class AutoCompleteItem {
public String placeName;
public String placeID;
@Override
public String toString() {
return placeName;
}
}