2013-06-11 3 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 (...) 직후라는 것을 알 수 있지만, 시간이 좀 이상 :

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

간과 한 더 좋은 해결책이 있습니까?

답변

2

UI 스레드의 메시지 대기열이 즉시 실행되지 않을 수 있으며이 때문에 onItemSelected가 즉시 호출되지 않기 때문에 생각했습니다.

정확함, 다소 차이가 있습니다. setSelection()으로 전화하면 onItemSelected()이 트리거되며, 대기열과 주 응용 프로그램 스레드가 모두 처리합니다.

메시지 대기열 (looper?)이 진행하기 전에 대기중인 모든 이벤트를 처리하려면 어떻게해야합니까?

그렇지 않습니다.

간과 한 더 좋은 해결책이 있습니까?

당신은 RunnablelistView.setItemChecked(adapter.getPosition(item), true);을 포장하고 (모든 View에 사용 가능) post()에 대한 호출을 통해 큐에 추가 할 수 있어야합니다. 위의 코드는 onItemSelected()이 처리 된 후에 실행되어야합니다.

관련 문제