Intereting Posts
Ошибка: обновлено обновление проекта «Приветствие» в Gradle: Ошибка сборки скрипта, неподдерживаемый метод DSL-меток Gradle: «setRoot ()»! Как обновить Android AppWidget после обновления / переустановки приложения? Как обнаружить USB-устройство в Android Как использовать цвет как образ заполнителя с Picasso? Как импортировать новый модуль (проект библиотеки Android) с помощью Android studio 0.3.0 Служба создается снова после onTaskRemoved В чем разница в GCC между -std = gnu ++ 0x и -std = c ++ 0x и какой из них следует использовать? Платформа Android Pay: Public, Private Key (эллиптическая кривая с NISTP-256) Android – Как удалить View в макете (динамический просмотр добавлен) InputFilter на EditText вызывает повторный текст Синтетический и пользовательский макет Kotlin в DialogFragment Веб-браузер Progressbar, такой как браузер Chrome Android в пожертвованиях приложений Программно переключение мобильных данных на Android 4.4.2 Вызывается: java.lang.NoClassDefFoundError: класс не найден с загрузчиком загрузчика; Нет доступной трассировки стека

Как добавить пользовательский адаптер в 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, чтобы лучше соответствовать моим потребностям, удалив значительную часть служебных накладок базового класса, что не было актуально для моего варианта использования. Но несколько строк, приведенных выше, дают вам хорошее начало и обеспечивают надежную ссылку для начала настройки.