Android Spinner - onItemSelected/setOnItemSelectedListener не запускается

Это сводит меня с ума, так как я делал это раньше, но не могу понять, почему это не работает сейчас...

У меня есть кнопка меню, реализованная обычным образом через файл menu.xml и метод onOptionsItemSelected с переключателем в нем, который создает и отображает счетчик.

Я добавил setOnItemSelectedListener, но он никогда не срабатывает. Появляется счетчик, я выбираю вариант или отступаю, ни onItemSelected, ни onNothingSelected не вызываются.

Вот весь код между «case» и «return true» в операторе switch, обрабатывающем кнопку меню. (topThis — это переменная, относящаяся к контексту активности — отлично работает для всех других тостов в приложении)

String[] widgetModes = {"Mode 1", "Mode2"};
ArrayAdapter<String> widgetModeAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, widgetModes);
widgetModeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Spinner widgetModeSpinner = new Spinner(this);
widgetModeSpinner.setAdapter(widgetModeAdapter);
widgetModeSpinner.setPrompt("Choose Widget Mode");

widgetModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener()
{
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
    {
        Toast.makeText(topThis, "derp", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView)
    {
        Toast.makeText(topThis, "herf", Toast.LENGTH_LONG).show();
    }
});

widgetModeSpinner.performClick();

Любые идеи? Я смутно подозреваю, что проблема в том, что я программно создаю Spinner...


person Greg    schedule 07.02.2011    source источник
comment
возможно, попробуйте parentView.getContext()? Вам не нужно добавлять его куда-то в UI? - это может означать, что события взаимодействия с пользовательским интерфейсом, такие как выбор элемента, не передаются счетчику.   -  person Jems    schedule 07.02.2011
comment
Спасибо за совет - в итоге реализовал что-то в этом роде. Добавил в макет невидимый счетчик, переместил все, кроме PerformClick, из метода меню в метод, вызываемый в onCreate. Кажется, гарантирует, что слушатель привязан к текущему раздутому макету или что-то в этом роде. Позиция кода относительно setContentView(R.layout.main); является важным...   -  person Greg    schedule 08.02.2011
comment
Я думаю, что тот факт, что остальная часть моего кода включает время от времени повторное расширение макета (с использованием setContentView(R.layout.main);), также вызывает проблемы... слушатели больше не подключаются, если не установлены снова после повторного заполнения макета.   -  person Greg    schedule 08.02.2011
comment
Вы должны попробовать с простым журналом. я(тэг, сообщение) ; вместо Toast, чтобы подтвердить, что это не ваш контекст topThis, вызывающий это?   -  person TouchBoarder    schedule 05.10.2012
comment
Вы определяете onItemSelectedListener, но вызываете синтетический PerformClick().... Может быть, вместо этого вам следует переопределить onItemClicked()?   -  person Shark    schedule 07.12.2012
comment
@Shark нет onItemClickListener для Spinners.   -  person A Person    schedule 13.04.2013
comment
@Siidheesh onItemSelected() в этом случае...   -  person Shark    schedule 15.04.2013
comment
Ваш комментарий о перераспределении макета помог мне в случае, когда я пытался добавить счетчики к элементам ListView, которые продолжают перерисовываться. Я перешел на PopupMenus, который оказался намного проще.   -  person arlomedia    schedule 20.08.2014
comment
PerformClick, вероятно, вызывает проблему. Он возвращает первый элемент, а после выбора элемента возвращает InputEventReceiver: Попытка завершить событие ввода, но приемник события ввода уже удален. Работу пока не нашел.   -  person LadyWoodi    schedule 11.03.2016
comment
Временное решение: мне пришлось добавить счетчик в xml (не забудьте android:spinnerMode="dialog", и вы можете установить 0 параметров размера) и изменить = новый счетчик (это); на `= (Spinner) findViewById(R.id.dialog_spinner);`   -  person LadyWoodi    schedule 11.03.2016


Ответы (4)


arrow_upward
14
arrow_downward

У меня была аналогичная проблема, когда я реализовывал счетчик, я решил ее, получив родительский вид и установив адаптер-

spinner1 =(Spinner)findViewById(R.id.spinner1);
spinner1.setAdapter(BindSpinner("ProgramMaster",cols,null,true,""));
spinner1.setOnItemSelectedListener(new OnItemSelectedListener()
{
protected Adapter initializedAdapter=null;
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
    {
        if(initializedAdapter !=parentView.getAdapter() ) {
            initializedAdapter = parentView.getAdapter();
           return;
        }

        String selected = parentView.getItemAtPosition(position).toString();

        if(abc.equals("Select") && !selected.equals("Select"))
        {
            do something
        }

        else
        {
            Do something
        }
        textQualification=selected;
        SearchUpdated("Qualification");
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }
});
person JNI_OnLoad    schedule 25.01.2013

arrow_upward
6
arrow_downward

Помните, что вы не можете повторно выбрать один и тот же элемент счетчика, он всегда устанавливает первый элемент как выбранный, если вы не добавляете какой-либо пользовательский код для обработки выбора счетчика.

Чтобы Toast не отображался, я бы предложил всегда использовать «MyActivity.this» в качестве контекста при создании Toast внутри интерфейса прослушивателя, например:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        /**
         * Called when a new item is selected (in the Spinner)
         */
         public void onItemSelected(AdapterView<?> parent, View view,
                    int pos, long id) {
                // An spinnerItem was selected. You can retrieve the selected item using
                // parent.getItemAtPosition(pos)

                Toast.makeText(MyActivity.this, "Hello Toast",Toast.LENGTH_SHORT).show();

            }

            public void onNothingSelected(AdapterView<?> parent) {
                // Do nothing, just another required interface callback
            }

    }); // (optional)

А .show() в конце иногда легко забыть;)

person TouchBoarder    schedule 06.10.2012

arrow_upward
5
arrow_downward

На самом деле, если для вашего счетчика видимости установлено значение gone, тогда он будет вызывать щелчок по нему при вызове метода performclick(), но не будет запускать его setOnItemSelectedListener< /strong> поэтому вам нужно изменить видимость, тогда это сработает

person Mehroz Munir    schedule 08.03.2016

arrow_upward
2
arrow_downward

Я знаю, что вопрос немного устарел, но если вы ожидаете обратного вызова AsyncTask, убедитесь, что вы сообщили адаптеру об изменениях данных, вызвав notifyDataSetChanged() в потоке обратного вызова!

@Override
public void onPostExecute(String result) {
   ///do something with your data
   spinnerArrayAdapter.notifyDataSetChanged();
}
person Community    schedule 15.09.2013
comment
Спасибо. 2 часа копался :) - person Jonas Liljestrand; 04.01.2015