如何从双字符串对象列表中绑定AutoCompleteTextView?

时间:2015-06-20 16:42:15

标签: android

我的布局中有一个自动填充文本框,我使用自定义适配器填充自动填充建议。

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个对象的列表。但我无法将其绑定到我的自动填充文本框。

我想要达到的目标是:

  1. 自动填充框将仅显示placeName的autoCompleteItem对象列表中的建议。 (即建议不会显示placeID)

  2. 点击建议时,我希望在面包上显示placeID。

1 个答案:

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