У меня есть счетчик, который фильтрует адаптер в OnItemSelected. Как это:Android: выполнить незавершенное событие немедленно?
@Override
public void onItemSelected(AdapterView<?> av, View v, int position, long id) {
switch (av.getId()) {
case R.id.spfilteroptions:
adapter.getFilter().refresh(); // <- what this post is about
break;
}
}
Так что теперь я хочу сделать:
spinner.setSelection(...)
тогда как следующей инструкции я:
listView.setItemChecked(adapter.getPosition(item), true);
Вторая инструкция опирается на onItemSelected обратный вызов, уже сделал свой потому что getPosition возвращает правильное значение только после применения фильтра (очевидно)
Так я полагаю, этот код не является оптимальным, так как
adapter.getFilter().refresh();
осуществляется в фоновом режиме и listView.setItemChecked (позиция, правда), конечно, называется до завершения фильтрации.
Так я это сделать:
adapter.ignoreFilteringRequests(true) // my own method in the adapter that results in ignoring filter() requests
spinner.setSelection(...) // now onItemSelected callback should not trigger filtering...
adapter.ignoreFilteringRequests(false)
// now I have this instead:
adapter.getFilter().filter(myContraint, new Filter.FilterListener(){
@Override
public void onFilterComplete(int count) {
listView.setItemChecked(adapter.getPosition(item), true);
}
})
Я заметил, что onItemSelected не вызывается сразу после spinner.setSelection (...), но спустя некоторое время. Это приводит к тому, что filter() в обратном вызове onItemSelected должен выполняться тоже, независимо от параметра adapter.ignoreFilteringRequests() (после setSelection()) снова было установлено значение false. Что вызывает это, и как я могу избежать этого? Я думал, что это может быть связано с тем, что очередь сообщений в потоке пользовательского интерфейса не выполняется немедленно, и из-за этого onItemSelected также не вызывается сразу. Если это так, как мне заставить очередь сообщений (looper?) Обрабатывать все ожидающие события непосредственно перед тем, как двигаться дальше?
Есть ли еще более элегантное решение для этого, возможно, я пропустил?