Элемент Spinner автоматически выбирается при входе в активность. Как мне избежать этого? - PullRequest
14 голосов
/ 20 марта 2011

В моем приложении для Android есть счетчик, и его событие onItemSelected() автоматически запускается при входе в действие.

Как мне избежать этого?

Ответы [ 8 ]

9 голосов
/ 25 июня 2014

Мы можем использовать флаг, и просто включить его, когда действительно коснется спиннера.

private boolean isSpinnerTouched = false; 

spinner.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                isSpinnerTouched = true;
                return false;
            }
        });
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> adapter, View arg1,
                        int arg2, long arg3) {
                    if (!isSpinnerTouched) return;
                    // do what you want 
                    }
        });
6 голосов
/ 28 августа 2017

Чтобы добавить Джерри Абрахама, Вы должны очистить выделение перед включением setOnItemSelectedListener

  Spinner mSpinner=(Spinner)findViewById(R.id.mySpinner);
  int initialSelectedPosition=mSpinner.getSelectedItemPosition();
  mSpinner.setSelection(initialSelectedPosition, false); //clear selection
  mSpinner.setOnItemSelectedListener(this); //set listener after clearing section
5 голосов
/ 20 марта 2011

Нет способа избежать этого.

Вы можете добавить флаг, указывающий на готовность вашего приложения, и использовать его в своем методе onItemSelected (), чтобы решить, что делать в каждом случае.

2 голосов
/ 21 июля 2013

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

        int initialposition=spinner.getSelectedItemPosition();
        spinner.setSelection(initialposition, false);

Это позволит избежать входа в onItemSelected ()

0 голосов
/ 22 января 2019

Вы можете избежать этого, проигнорировав первый клик,

private boolean isSpinnerInitial = true; //As global variable

public void onItemSelected(xxx xxx, xxx xxx, xxx xxx, xxx xxx) {
    if(isSpinnerInitial) {
        isSpinnerInitial = false;
        return;
    }
    // Write your code here
}
0 голосов
/ 11 января 2017

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

Spinner mySpinner = (Spinner)findViewById(R.id.spinner_xml_pro);
        mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if(isSpinnerInitial){ // globar var boolean isSpinnerInitial = false;
                 //do something
               }else
                    isSpinnerInitial=true;
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

Проверьте это с помощью spinner.post (new Runnable () ...) или этот другой мой источник

0 голосов
/ 10 марта 2014

Ну, вы можете добавить фиктивную выборку к исходному адаптеру и игнорировать номер позиции в setOnItemSelectedListener. Это не красиво, но это работает. См. Этот код для настройки элементов для адаптера массива.

List<String> names = new ArrayList<String>();
names.add("");
names.addAll(realValues);

Тогда в вашем setOnItemSelectedListener вы можете сделать это:

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
    {
        if (position > 0)
        {
            String name = names.get(position - 1);
        }
        else
        {
            Log.d(TAG, "selected nothing or perhaps the dummy value");
        }
    }
0 голосов
/ 07 мая 2011

Я нашел решение этой проблемы и разместил его здесь (с примером кода):

Spinner onItemSelected () выполняется, когда не предполагается, что

...