Spinner

 V*D*V

Когда необходимо полностью обновить информацию в Spinner при использовании ArrayAdapter из отдельного потока возникает ряд проблем:

Обновление данных в Spinner, либо вызов notifyDataSetChanged у адаптера необходимо сделать из потока пользовательского интерфейса.

После обновления данных стандартным способом видимый выбранный объект не совпадает с получаемым через метод getSelectedItem()

 

Для решения проблемы смена данных (или вызов метода адаптера notifyDataSetChanged) и смена выбора происходит каскадным запуском потоков.

 

new Thread() {

 @Override

 public void run() {

         result = calculate( ... );

         new Handler( getMainLooper() ).post( new Runnable() {

                 @Override

                 public void run() {

                         // вписать данные валюты в выпадающий список

                         final ArrayAdapter<String> adp = new ArrayAdapter<String>( MyActivity.this, android.R.layout.simple_spinner_item, result.getItems() );

                         mSpinner.setAdapter( adp );

                         mSpinner.post( new Runnable() {

                                 @Override

                                 public void run() {

                                         mSpinner.setSelection( adp.getPosition( ... ) );// генерирует событие изменения

                                 }

                         });

                 }

         });

 }

}.start();