2016-10-16 6 views
3

У меня есть активность, которая имеет много каскадных счетчиков и после выбора первого, второго счетчика инициализирует и заполняет данные и после выбора элемента из второго, третьего счетчика инициализирует и заполняет данные и так далее.Dynamically setSelection of spinner, не запускать OnItemSelectedListener

для каждой блесны я создаю их, как это, и это является итеративным:

public ArrayList<MaterialSpinner> spinnerlist = new ArrayList<>(); 

public void createView(){ 
final MaterialSpinner spinner = new MaterialSpinner(context); 
     spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){//...after select item next spinner creates with calling createView() iteratively} 
     loadSpinnerData(); // set adapter and more 
     spinnerlist.add(spinner); 
} 

каждые вещи идут правильно, когда выбор является пользователем, но когда я использую setSelection(positionOfItem) Динамически, к сожалению

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()

не звонит. Я не знаю, почему это происходит.

for (int i = 0; i < some_value; i++) { 

      int positionOfItem = get_proper_position; 
      spinnerList.get(i).setSelection(positionOfItem); //this not trigger onItemSelect! 
     } 

проблема есть здесь. размер spinner равен 1 в первый раз, но после setselection слушатель не вызывает и второй spinner не создает.

Я также думал, что это из-за трудоемких действий, поэтому постарайтесь использовать run-able и после некоторой задержки, но это не сработало.

+0

Я предполагаю, что вы делаете setSelection перед инициализацией setOnItemSelectedListner. он всегда должен называть setOnItemSelectedListner. Пожалуйста, проверьте этот сценарий и, пожалуйста, поделитесь своим кодом –

+0

@MiralBhalani Я обновил вопрос. первый spiner создается и инициализируется и добавляется в список, но на выбранном не работает – Kenji

+0

вы можете дать некоторую информацию о categoryId, что находится в этом? –

ответ

2

Наконец-то я нахожу жуткое решение. похоже, проблема в системе Android, требующей некоторого времени для создания элементов и представлений. , когда я вызываю onClickListener первого счетчика, он должен создать второй и заполнить данные, и это требует времени. так что я должен был поставить задержку для каждого пункта с переменными интервалами:

for (int i = 0; i < some_value; i++) { 
      selectItemOfSpinner(i); 
     } 


private void selectItemOfSpinner(final int i) { 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      MaterialSpinner spinner = spinnerList.get(i); 
      int positionOfItem = get_proper_position; 
      spinner.setSelection(positionOfItem, true); 
     } 
    }, 50*i); 

} 

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

+0

Хорошая работа ........................... – Abhi

+1

Вместо postDelayed просто используйте сообщение. Это отложит код Выполнение внутри выполняется до тех пор, пока макет не будет нарисован. Не нужно устанавливать произвольное время для отсрочки. – Vlad

0

Я думаю, что вы пытаетесь достичь достижимо с performItemClick

for (int i = 0; i < some_value; i++) { 

     int positionOfItem = get_proper_position; 
     MaterialSpinner spinner = spinnerList.get(i); 
     spinner.setSelection(positionOfItem); 

     View itemView = (View)spinner.getChildAt(positionOfItem); 
     long itemId = your_spinner.getAdapter().getItemId(positionOfItem); 

     spinner.performItemClick(itemView, positionOfItem, itemId); 
} 

setSelection не срабатывает OnItemSelectedListener но performItemClick делает.

+0

Я проверю и сообщит вам – Kenji

+0

(View) spinner.getChildAt (positionOfItem); return null – Kenji

+0

'int positionOfItem = get_proper_position;' что возвращает positionOfItem? – fluffyBatman