игнорировать включение OnItemSelectedListener при создании - PullRequest
14 голосов
/ 03 марта 2010

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

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

Ответы [ 5 ]

2 голосов
/ 08 января 2013

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

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

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

// 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);
            }
        }
    });
}
1 голос
/ 27 сентября 2013

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

@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 
    }
}
1 голос
/ 24 декабря 2011

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

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

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

0 голосов
/ 17 февраля 2014

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

public void onResume() {
    super.onResume();
    new DoLater(this, 500) {
                public void run() {
                    new OnSpinnerSelectedAdapter(getBowSpinner()) {
                        protected void onItemSelected(int position) {
                            onBowSelected(position);
                        }
                    };
                }
            };
}
0 голосов
/ 15 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...