Intereting Posts
Как решить эту ошибку "com.android.internal.telephony не может быть разрешен для типа" в android Notification Кнопки не работают Как я могу использовать режим пакетной камеры для новых телефонов Android в моем приложении? Как автоматизировать сборку андроидов для облегченной и премиальной версии? Неважно, в каком порядке я называю finish () и startActivity ()? Android – Как получить использование памяти моего устройства Android Android Spinner – Как удалить радиокнопки? Как создать руководство пользователя в приложении Android? Выберите отдельное значение в android sqlite Должен ли я использовать Фрагменты для получения LoaderManager? EditText с мягкой клавиатурой и кнопкой «Назад» Разбитые фоны по умолчанию, например, для EditText или нажатого состояния в TabLayout и панели инструментов Фрагменты Android в Backstack занимают слишком много памяти Как разрешить доменное имя Bonjour с помощью JmDNS База данных Sqlite, обновляющая строку android

Как добавить пользовательский адаптер в AutoCompleteTextView

Есть ли простой способ установить раскрывающийся список 2 TextView в AutoCompleteTextView.

Существует android.R.layout.two_line_list_item Я не нашел примеров использования.

Итак, я попробовал это:

 public class TwoLineDropdownAdapter extends BaseAdapter { private LayoutInflater mInflater = null; private Activity activity; public ArrayList<TwoLineDropDown> values = new ArrayList<TwoLineDropDown>(); public TwoLineDropdownAdapter(Activity a, ArrayList<TwoLineDropDown> items) { values = items; activity = a; mInflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public int getCount() { return values.size(); } public TwoLineDropDown getItem(int position) { return values.get(position); } public long getItemId(int position) { return position; } public static class ViewHolder { public TextView title; public TextView description; } public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.dropdown_text_twoline, parent, false); holder.title = (TextView) convertView .findViewById(R.id.text1); holder.description = (TextView) convertView .findViewById(R.id.text2); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } return convertView; } public void add(TwoLineDropDown ei) { values.add(ei); } } 

Но я столкнулся с проблемой:

 TwoLineDropdownAdapter AutoCompleteAdapter = new TwoLineDropdownAdapter(this, items); myAutoComplete.setAdapter(AutoCompleteAdapter); 

При установке адаптера он говорит:

Связанное несоответствие: общий метод setAdapter (T) типа AutoCompleteTextView не применим для аргументов (TwoLineDropdownAdapter). Выведенный тип TwoLineDropdownAdapter не является допустимым заменой ограниченного параметра

Как это решить?

Спасибо

Согласно документации, предполагаемый тип setAdapter в AutoCompleteTextView:

 <T extends ListAdapter & Filterable> void setAdapter(T adapter) 

Ваш адаптер должен быть ListAdapter (какой BaseAdapter, насколько это хорошо), и Filterable, который BaseAdapter не является, и не является вашей адаптацией. Я бы расширил ArrayAdapter, который является фильтруемым, не говоря уже о том, что это упростит вашу реализацию (некоторые из ваших методов дублируют методы ArrayAdapter для того же результата):

 public class TwoLineDropdownAdapter extends ArrayAdapter<TwoLineDropDown> { private LayoutInflater mInflater = null; private Activity activity; public TwoLineDropdownAdapter(Activity a, ArrayList<TwoLineDropDown> items) { super(a, 0, items); activity = a; mInflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public static class ViewHolder { public TextView title; public TextView description; } public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.dropdown_text_twoline, parent, false); holder.title = (TextView) convertView .findViewById(R.id.text1); holder.description = (TextView) convertView .findViewById(R.id.text2); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } return convertView; } } 

Здесь Code работает для меня,

Установите этот адаптер в autocompletetextview

 AutoCompleteTextView etProductSearch = (AutoCompleteTextView)getView().findViewById(R.id.edtSearchBoxTakeOrder); ProductSearchAdapter adapter = new ProductSearchAdapter(getActivity(), android.R.layout.simple_dropdown_item_1line, productList); etProductSearch.setAdapter(adapter ); 

Класс ProductSearchAdapter

 import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.TextView; public class ProductSearchAdapter extends ArrayAdapter<ProductDataModel> { private ArrayList<ProductDataModel> items; private ArrayList<ProductDataModel> itemsAll; private ArrayList<ProductDataModel> suggestions; private int viewResourceId; @SuppressWarnings("unchecked") public ProductSearchAdapter(Context context, int viewResourceId, ArrayList<ProductDataModel> items) { super(context, viewResourceId, items); this.items = items; this.itemsAll = (ArrayList<ProductDataModel>) items.clone(); this.suggestions = new ArrayList<ProductDataModel>(); this.viewResourceId = viewResourceId; } public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(viewResourceId, null); } ProductDataModel product = items.get(position); if (product != null) { TextView productLabel = (TextView) v.findViewById(android.R.id.text1); if (productLabel != null) { productLabel.setText(product.getProductName()); } } return v; } @Override public Filter getFilter() { return nameFilter; } Filter nameFilter = new Filter() { public String convertResultToString(Object resultValue) { String str = ((ProductDataModel) (resultValue)).getProductName(); return str; } @Override protected FilterResults performFiltering(CharSequence constraint) { if (constraint != null) { suggestions.clear(); for (ProductDataModel product : itemsAll) { if (product.getProductName().toLowerCase() .startsWith(constraint.toString().toLowerCase())) { suggestions.add(product); } } FilterResults filterResults = new FilterResults(); filterResults.values = suggestions; filterResults.count = suggestions.size(); return filterResults; } else { return new FilterResults(); } } @Override protected void publishResults(CharSequence constraint, FilterResults results) { @SuppressWarnings("unchecked") ArrayList<ProductDataModel> filteredList = (ArrayList<ProductDataModel>) results.values; if (results != null && results.count > 0) { clear(); for (ProductDataModel c : filteredList) { add(c); } notifyDataSetChanged(); } } }; } 

Я считаю, что самый простой подход – расширить SimpleAdapter .

 public class MyAdapter extends android.widget.SimpleAdapter { static ArrayList<Map<String, String>> toMapList(Collection<MyObject> objectsCollection) { ArrayList<Map<String, String>> objectsList = new ArrayList<Map<String, String>>(objectsCollection.size()); for (MyObject obj : objectsCollection) { Map<String, String> map = new HashMap<String, String>(); map.put("name", obj.getName()); map.put("details", obj.getDetails()); objectsList.add(map); }; return objectsList; } public MyAdapter(Context context, Collection<MyObject> objects) { super(context, toMapList(objects), R.layout.auto_complete_layout, new String[] {"name", "description"}, new int[] {R.id.name, R.id.description}); } } 

Главный недостаток заключается в том, что это приведет к кандидатам на основе любого слова с разделителем пробела в любом названии или описании. Если вы добавите другое поле в ваш auto_complete_layout , оно также будет auto_complete_layout в соответствие.

Поэтому я закончил с переписыванием SimpleAdapter, чтобы лучше соответствовать моим потребностям, удалив значительную часть служебных накладок базового класса, что не было актуально для моего варианта использования. Но несколько строк, приведенных выше, дают вам хорошее начало и обеспечивают надежную ссылку для начала настройки.