Исключение одновременной модификации в publishResults

Я внедряю фильтр в свой пользовательский адаптер, но получаю CME, когда нажимаю значок поиска на панели действий. Я провожу некоторые исследования и редактирую свой код, но безрезультатно.

Мой код:

private class TaskFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            constraint = constraint.toString().toLowerCase();
            FilterResults result = new FilterResults();
            if (constraint != null && constraint.toString().length() > 0) {
                ArrayList<TaskModel> filteredItems = new ArrayList<TaskModel>();

                for (int i = 0, l = originalList.size(); i < l; i++) {
                    TaskModel country = originalList.get(i);
                    if (country.getName().toString().toLowerCase().contains(constraint))
                        filteredItems.add(country);
                }
                result.count = filteredItems.size();
                result.values = filteredItems;
            } else {
                synchronized (this) {
                    result.values = originalList;
                    result.count = originalList.size();
                }
            }
            return result;
        }

        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            clear();
            List<TaskModel> listcopy = (List<TaskModel>) results.values;
            synchronized (listcopy) {
                for (Iterator<TaskModel> it = listcopy.iterator(); it.hasNext(); ) {  
                    TaskModel f = (TaskModel) it.next();  //this one cause the CME
                    add(f);
                }  
            }
            notifyDataSetChanged();
        }
    }

Что я могу сделать?


person Minh Phan    schedule 24.04.2014    source источник
comment
Опубликовать полную трассировку стека.   -  person nKn    schedule 24.04.2014
comment
что такое метод add(f)? пожалуйста, опубликуйте это тоже   -  person drulabs    schedule 24.04.2014
comment
Это просто метод add() в ArrayAdapter   -  person Minh Phan    schedule 24.04.2014
comment
Всегда ли встречается CME? Вы где-то используете Threads?   -  person nKn    schedule 24.04.2014
comment
да, каждый раз, когда я нажимаю значок поиска на панели действий. Я реализовал вкладку смахивания в своем приложении, в котором 1 действие содержит 2 фрагмента, каждый фрагмент имеет один AsyncTaskLoader для загрузки данных. CME не происходило, пока я не реализовал фильтр   -  person Minh Phan    schedule 25.04.2014
comment
Есть что-то редкое, я скопировал ваш код в свой проект, заполнил List несколькими экземплярами класса и сделал цикл for, как у вас, и не выдает CME. Это действительно не должно, поскольку вы ничего не изменяете. Не могли бы вы опубликовать полную трассировку стека и перепроверить, действительно ли указанная вами строка выдает CME?   -  person nKn    schedule 25.04.2014
comment
Возможный дубликат ConcurrentModificationException внутри PublishResult - ArrayAdapter   -  person Alireza Noorali    schedule 09.01.2019