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 (...) 직후라는 것을 알 수 있지만, 시간이 좀 이상 :
그래서 나는이 작업을 수행. 이로 인해 adapter.ignoreFilteringRequests()에 관계없이 onItemSelected 콜백의 filter()가 실행됩니다 (setSelection() 후에 다시 false로 설정 됨). 이 문제의 원인은 무엇이며 어떻게 피할 수 있습니까? 즉시 실행되지 않는 UI 스레드의 메시지 대기열과 관련이있을 수 있으며이 때문에 onItemSelected가 즉시 호출되지 않는다고 생각했습니다. 이 경우, 계속 진행하기 전에 대기중인 모든 이벤트를 처리하기 위해 메시지 큐 (looper?)를 어떻게 야기합니까?간과 한 더 좋은 해결책이 있습니까?