2013-06-11 1 views
0

У меня есть счетчик, который фильтрует адаптер в 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?) Обрабатывать все ожидающие события непосредственно перед тем, как двигаться дальше?

Есть ли еще более элегантное решение для этого, возможно, я пропустил?

ответ

2

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

Правильно, более или менее. Ваш вызов на setSelection() вызовет onItemSelected(), когда все это обрабатывается в очереди и в главном потоке приложения.

Если это так, как я могу заставить очередь сообщений (looper?) Обрабатывать все ожидающие события непосредственно перед перемещением?

У вас нет.

Есть ли более элегантное решение для этого, я, возможно, не обратил внимания?

Вы должны быть в состоянии обернуть listView.setItemChecked(adapter.getPosition(item), true); в Runnable и добавить его в очередь через вызов post() (доступен на любом View). Это должно привести к тому, что вышеупомянутый код будет запущен после обработки onItemSelected().

 Смежные вопросы

  • Нет связанных вопросов^_^