В активити расположен AutoCompleteTextView
, вот собственно код:
Вот то, что находится в onCreate
:
clientATV = (AutoCompleteTextView)findViewById(R.id.clientATV);
List<Client> clientsList = getClientList(orderForm);
NamesAdapter namesAdapter = new NamesAdapter(OrderActivity.this, R.layout.activity_order, R.id.lbl_name, clientsList);
clientATV.setAdapter(namesAdapter);
Код адаптера взял на просторах интеренета, мне нужно было, чтобы поиск происходил не только с начальных символом, а и с середины строки:
public class NamesAdapter extends ArrayAdapter<Client> {
Context context;
int resource, textViewResourceId;
List<Client> items, tempItems, suggestions;
public NamesAdapter(Context context, int resource, int textViewResourceId, List<Client> items) {
super(context, resource, textViewResourceId, items);
this.context = context;
this.resource = resource;
this.textViewResourceId = textViewResourceId;
this.items = items;
tempItems = new ArrayList<Client>(items); // this makes the difference.
suggestions = new ArrayList<Client>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.autocomplete_item, parent, false);
}
Client names = items.get(position);
if (names != null) {
TextView lblName = (TextView) view.findViewById(R.id.lbl_name);
if (lblName != null)
lblName.setText(names.name);
}
return view;
}
@Override
public Filter getFilter() {
return nameFilter;
}
/**
* Custom Filter implementation for custom suggestions we provide.
*/
Filter nameFilter = new Filter() {
@Override
public CharSequence convertResultToString(Object resultValue) {
String str = ((Client) resultValue).name;
return str;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null && constraint.length()>2) {
suggestions.clear();
for (Client names : tempItems) {
if (names.name.toLowerCase().contains(constraint.toString().toLowerCase())) {
suggestions.add(names);
}
}
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) {
List<Client> filterList = (ArrayList<Client>) results.values;
if (results != null && results.count > 0) {
clear();
for (Client names : filterList) {
add(names);
notifyDataSetChanged();
}
}
}
};
}
А вот класс Client
, он содержит три поля, id из таблицы в БД, наименование и код.
public class Client {
public String name;
public String code;
public String id;
public Client(String name,String code,String id){
this.name = name;
this.code = code;
this.id = id;
}
}
А проблема вот в чем,я так понимаю, потому что у меня вместо массива строк, массив объектов класса Client
, в момент поиска возможных вариантов приложение падает с вот чем:
09-05 15:23:41.382 8355-8355/com.liverpoll.tabak.a1cmobit I/Choreographer: Skipped 97 frames! The application may be doing too much work on its main thread.
09-05 15:23:42.722 8355-8355/com.liverpoll.tabak.a1cmobit I/Choreographer: Skipped 69 frames! The application may be doing too much work on its main thread.
09-05 15:23:44.210 8355-8355/com.liverpoll.tabak.a1cmobit I/Choreographer: Skipped 88 frames! The application may be doing too much work on its main thread.
09-05 15:23:45.745 8355-8355/com.liverpoll.tabak.a1cmobit D/SELECTED_ITEM_ID: 35
09-05 15:23:50.034 8355-8355/com.liverpoll.tabak.a1cmobit D/AndroidRuntime: Shutting down VM
09-05 15:23:50.034 8355-8355/com.liverpoll.tabak.a1cmobit W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x40c3a930)
09-05 15:23:50.042 8355-8355/com.liverpoll.tabak.a1cmobit E/AndroidRuntime: FATAL EXCEPTION: main
java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569)
at com.liverpoll.tabak.a1cmobit.OrderActivity$NamesAdapter$1.publishResults(OrderActivity.java:222)
at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5236)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
at dalvik.system.NativeStart.main(Native Method)
Я так понимаю проблема в производительности, как можно оптимизировать этот момент? Может вместо класса использовать что-то другое? Мне просто нужна какая-то сущность, чтобы хранить там 3 поля.
The application may be doing too much work on its main thread.
Данная ошибка говорит о том, что вам стоит распараллелить ваши задачи. Для этого воспользуйтесь потоками.
Для чтения:
https://developer.android.com/guide/components/processes-and-threads?hl=ru
https://habr.com/post/124484/
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем известно, что стили из медиа запросов не применяются, если устройство не подходит под параметры, указанные в запросеА что с файлами,...
Не могу найти ошибкуПри смене слайда в слайдере на странице: http://www
Есть полигон, у которого не указан массив точекТребуется в процессе работы эти точки указать