spinner.setSelection не вызывает функции setOnItemSelectedListener

#java #android #listener #spinner #android-spinner

#java #Android #прослушиватель #счетчик #android-счетчик

Вопрос:

У меня есть 3 блесны. Каждый счетчик получает новые данные при установке предыдущего счетчика. Итак, у меня есть вложенный setOnItemSelectedListener в этот счетчик.

мой код выглядит примерно так:

  MyAdapter adapter = new MyAdapter(getActivity(), R.layout.res_custom_new, categories, response.body(), pos);
 adapter.setDropDownViewResource(R.layout.res_custom_new);
 spinner.setAdapter(adapter);
 spinner.setSelection(pos);

 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
     @Override
     public void onItemSelected(AdapterView << ? > adapterView, View view, int ii, long l) {
         //some code A
         second_spinner_destination_function();
     }
 });
  

second_spinner_destination_function() содержит еще 2 счетчика

 public void second_spinner_destination_function() {
 //some code
 ArrayAdapter < String > dataAd = new ArrayAdapter < String > (getActivity(), android.R.layout.simple_spinner_item, getDestination);
 dataAd.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
 spinnerdestination.setAdapter(dataAd);
 spinnerdestination.setSelection(posfrom);
 //code block B
 spinnerdestination.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
     @Override
     public void onItemSelected(AdapterView << ? > adapterView, View view, final int i, long l) {

         //some code C
         ArrayAdapter < String > dataAdapter2 = new ArrayAdapter < String > (getActivity(), android.R.layout.simple_spinner_item, getVesselName);
         dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         third_spinnervessels.setAdapter(dataAdapter2);
         third_spinnervessels.setSelection(posvessel);
         spinnervessels.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
             @Override
             public void onItemSelected(AdapterView << ? > adapterView, View view, int iii, long l) {

             }
         });
         //some code D              

     }
 });
 //some Code E
 }
  

Приведенный выше код сначала вызывается во время функции onCreate . После этого, если выпадающий список изменяется, выполняется соответствующий код.

Теперь вот моя проблема: поскольку все эти строки кода были запущены один раз во время oncreate, поэтому прослушиватели на блеснах установлены. Теперь допустим, я нажал на первый счетчик и что-то изменил. итак, теперь он будет «кодировать блок A», а затем вызовет second_spinner_destination_function() .

В second_spinner_destination_function() при обнаружении строки spinnerdestination.setSelection(posfrom) она должна немедленно запустить свою функцию onItemSelected(), но вместо этого она переходит к запуску блока кода B, затем устанавливает на него новый прослушиватель, а затем запускает «блок кода E» и после этого запускает onItemSelected() второго счетчика.

Я убедился, что spinnerdestination.setSelection(posfrom) получает новый индекс, а не такой же, как старый индекс. Есть идеи, почему он выполняется в этой последовательности?

Ответ №1:

Вы должны разделить блесны, потому что этот метод немедленно запускается на блесне, подключенной к адаптеру

spinnervessels.setOnItemSelectedListener(новый AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView << ? > AdapterView, View view, int iii, long l) {

        }
  

Комментарии:

1. можете ли вы объяснить немного больше, что вы подразумеваете под отдельным? Также я проверил, и он не запускается сразу после setselection()