Android Spinner - onItemSelected / setOnItemSelectedListener не запускается - PullRequest
18 голосов
/ 07 февраля 2011

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

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

Я добавил setOnItemSelectedListener, но, похоже, он никогда не срабатывает. Появляется вертушка, я выбираю опцию или возвращаюсь, ни onItemSelected, ни onNothingSelected не вызываются.

Вот весь код между «case» и «return true» оператора переключателя обработки кнопок меню. (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 программным способом ...

Ответы [ 4 ]

14 голосов
/ 25 января 2013

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

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
    }
});
6 голосов
/ 06 октября 2012

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

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

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 () в конце легко забыть иногда;)

5 голосов
/ 08 марта 2016

На самом деле, если видимость вашего счетчика установлена ​​на ушел , то он будет вызывать щелчок по нему при вызове метода executeclick () , но не будет запускать его setOnItemSelectedListener поэтому вам нужно изменить видимость, тогда она будет работать

2 голосов
/ 15 сентября 2013

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

@Override
public void onPostExecute(String result) {
   ///do something with your data  
   spinnerArrayAdapter.notifyDataSetChanged();
}
...