Подтвердить что ты не робот

Игнорировать запуск OnItemSelectedListener для создания

Я создаю spinner, и я добавил OnItemSelectedListener к нему. Однако я заметил, что он срабатывает при создании. Теперь мне было интересно, есть ли способ игнорировать/отказаться от него.

Я знаю, что могу использовать значение boolean, но немного "грязное".

4b9b3361

Ответ 1

Вот мое решение.

Мне нужно проигнорировать первое событие выбора элемента, потому что существует зависимость между Маршрутизатором класса маршрута и флажком маршрута.

И все мои элементы управления настроены на основе предыдущего посещения активности.

// Used to count the number of times the onItemSelected gets fired
private int mGradeSelectionCount = 0;

private void attachHandlers() {
    OnItemSelectedListener gradeRangeSelectionMadeListener;
    gradeRangeSelectionMadeListener = new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) {
            // If the counter is 0 then we can assume that it is android firing the event
            if (mGradeSelectionCount++ < 1) {
                return;
            }
            if (mCmbGradeFrom.getSelectedItemPosition() == 0) {
                // Uncheck the Route checkbox
                mChkTypeRoute.setChecked(false);
            } else {
                // Check the Route checkbox
                mChkTypeRoute.setChecked(true);
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // Dont care, keep the same values as before

        }
    };
    mCmbGradeFrom.setOnItemSelectedListener(gradeRangeSelectionMadeListener);
    mChkTypeRoute.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (!isChecked) {
                mCmbGradeFrom.setSelection(0);
                mCmbGradeTo.setSelection(0);
            }
        }
    });
}

Ответ 2

Не следует пытаться запретить вызов OnItemSelectedListener.

По умолчанию Android Spinners выбирают первый элемент, возвращаемый адаптером, и поэтому вызывается OnItemSelectedListener для запуска некоторых действий над этим элементом.

Я бы посоветовал, что первый элемент вашего адаптера Spinner - это пустой элемент, а ваш OnItemSelectedListener может игнорировать этот пустой элемент на основе его идентификатора.

Ответ 3

Это может вам помочь.

@Override  
public void onItemSelected( AdapterView<?> parent, View view, int position, long id)
{
    if(view!=null &&  view.getId()!=0){
        //do your code here to avoid callback twice 
    }
}

Ответ 5

Ну, я думаю, что нашел для меня приятное решение, я имел в виду это с самого начала, но... У меня есть собственный класс оболочки, основанный на обработчике android, который называется DoLater, а также есть пользовательский адаптер на основе Listener, поэтому вы не можете скопировать его, но вы получите представление. Опасной вещью является то, что почему-то задержка 500 может быть длинной, и вид может быть уже уничтожен (когда пользователь делает некоторые проводные вещи быстро или телефон замедляется...), поэтому DoLater заботится об этом, поэтому он не вызывается, когда активность не возобновляется. Но этот способ OnItemSelectedListener не запускается при создании.

public void onResume() {
    super.onResume();
    new DoLater(this, 500) {
                public void run() {
                    new OnSpinnerSelectedAdapter(getBowSpinner()) {
                        protected void onItemSelected(int position) {
                            onBowSelected(position);
                        }
                    };
                }
            };
}