Кто-нибудь знает, как предотвратить запуск метода onItemSelected() (интерфейс OnItemSelectedListener) при создании экземпляра макета? Мне нужно знать, есть ли способ сделать это, потому что я хочу сохранить способ создания экземпляра моего макета отдельно от этого слушателя.
Я попытался создать оператор if, изначально имеющий значение false для всего кода внутри переопределенного метода, но нет способа узнать, когда установить для него значение true, потому что переопределенный метод выполняется после методов onCreate(), OnStart() и onResume() каждый раз.
Я не нашел никаких четких ответов на этот вопрос. Мы были бы весьма признательны за любые четкие решения.
Переведено автоматически
Ответ 1
Дэвид, вот руководство, которое я написал для решения этой проблемы...
Постановка проблемы
нежелательный индикатор onItemSelected() запускается во время инициализации галереи (или счетчика). Это означает, что код выполняется преждевременно; код, который предназначен для выполнения ТОЛЬКО тогда, когда пользователь физически делает выбор.
Решение
в onCreate () подсчитайте, сколько виджетов галереи (или счетчика) у вас есть в представлении. (mGalleryCount)
в onItemSelected() подсчитайте, как часто он срабатывал. (mGalleryInitializedCount )
когда (mGalleryInitializedCount < mGalleryCount) == false, тогда выполняется код, предназначенный для пользователя
Пример кода
publicclassmyActivityextendsActivityimplementsOnItemSelectedListener { //this counts how many Gallery's are on the UI privateint mGalleryCount=0;
//this counts how many Gallery's have been initialized privateint mGalleryInitializedCount=0;
//get references to UI components mGallery = (Gallery) findViewById(R.id.mygallery);
//trap selection events from gallery mGallery.setOnItemSelectedListener(this);
//trap only selection when no flinging is taking place mGallery.setCallbackDuringFling(false);
// //do other stuff like load images, setAdapter(), etc //
//define how many Gallery's are in this view //note: this could be counted dynamically if you are programmatically creating the view mGalleryCount=1;
}
publicvoidonItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (mGalleryInitializedCount < mGalleryCount) { mGalleryInitializedCount++; } else { //only detect selection events that are not done whilst initializing Log.i(TAG, "selected item position = " + String.valueOf(position) ); }
}
}
Почему это работает
это решение работает, потому что Галерея завершает инициализацию задолго до того, как пользователь физически сможет сделать выбор.
Ответ 2
Вот модифицированная версия кода "Кто-то где-то". Вы можете использовать его, если у вас есть единственное представление.
publicclassmyActivityextendsActivityimplementsOnItemSelectedListener { // Set view initialization to false while the it is being built privatebooleaninitializedView=false;
m_spnTemplates.setOnItemSelectedListener(newSpinner.OnItemSelectedListener() { @Override publicvoidonItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
//trying to avoid undesired spinner selection changed event, a known problem if (m_intSpinnerInitiCount < NO_OF_EVENTS) { m_intSpinnerInitiCount++; } else { //YOUR CODE HERE } }
Ответ 4
Вчера я столкнулся с этой проблемой с помощью OnCheckedChangedListener . В итоге я добавил логическую переменную экземпляра, инициализированную значением true внутри моего класса адаптера, с помощью метода доступа isListenerEnabled() . Затем я устанавливаю переменной значение false в своем коде макета и снова устанавливаю его в true в конце кода макета. В моем прослушивателе я проверяю значение переменной, чтобы решить, выполнять код прослушивателя или нет.