Как остановить вызовы getView, пока я не вызову notifyDatasetChanged() еще раз?ArrayAdapter - как остановить вызовы getView?
Мой вопрос:
У меня есть текстовое поле, который фильтрует адаптер на textchange. Если я слишком часто меняю текст, я получаю ArrayIndexOutOfBoundsException, потому что getView, конечно же, все еще обращается к списку адаптера, когда операция фильтрации посылок уже запущена.
Так ATM это выглядит следующим образом:
- фильтр в фоновом режиме + notifyDatasetChanged
- GetView вызывается несколько раз
- Хотя следующий фильтр обрабатывается, GetView еще называют в фоновом режиме из-за первый фильтр. Но GetView получает исключение из-за доступа к списку (список изменений операции фильтрации). Поэтому я хочу остановить вызовы GetView и THEN запустить любую заданную операцию фильтра.
EDIT:
я думал о возвращении из GetView немедленно, если я вижу фильтр нить активна?
EDIT:
OK соответствующий код адаптера:
@Override
protected FilterResults performFiltering(CharSequence constraint) {
filterLock.acquireUninterruptibly();
FilterResults r = new FilterResults();
List<T> items = null;
m_Filter = constraint;
if (constraint == null /* TextUtils.isEmpty(constraint) */) { // AR
// auskommentiert
// da
// ungewünscht
items = m_AllItems;
} else {
items = m_FilteredItems;
items.clear();
synchronized (SyncLock) {
for (T item : m_AllItems) {
if (DynamicArrayAdapter.this.filter(item, constraint)) {
items.add(item);
}
}
}
}
r.values = items;
r.count = items.size();
return r;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
m_Items = (List<T>) results.values;
notifyDataSetChanged();
filterLock.release();
}
Это фильтр, который простирается от фильтра. m_Items и m_AllItems используются в адаптере (первый содержит отфильтрованный, второй - нефильтрованный). Как вы можете видеть, они не изменены в performFiltering(). Также filterLock - это семафор размера 1, так что в это же время не происходит двух фильтрующих операций.
EDIT2:
также, в моем OnTextChanged я могу заверить вас, что я не изменить адаптер есть в любом случае либо, ни я в методе фильтра(), который вызывается из performFiltering()
Вы не должны пытаться остановить вызовы 'getView()', вместо этого вы должны стремиться внедрить лучшую систему фильтрации. Отправьте код, который у вас есть для операции фильтрации. – Luksprog
Вы усложнили операцию фильтрации. Блокировка в основном бесполезна, так как вы не можете одновременно выполнять две операции фильтрации, используя класс «Фильтр». Для доступа к списку данных необходимо выполнить единственную синхронизацию. Кроме того, ** ** копии ** списка не разделяют списки данных. – Luksprog
Я могу поклясться, что я отслеживаю 2 потока через performFiltering, которые были там вместе. Вот почему я это сделал. В любом случае это не повредит Я думаю – cdbeelala89