Android

Spinner onItemSelected() executes inappropriately [duplicate]

Spinner onItemSelected() выполняется ненадлежащим образом

Возможный дубликат:

Android Spinner onItemSelected Вызван ошибочно (без действий пользователя при открытии spinner)


Кто-нибудь знает, как предотвратить запуск метода onItemSelected() (интерфейс OnItemSelectedListener) при создании экземпляра макета? Мне нужно знать, есть ли способ сделать это, потому что я хочу сохранить способ создания экземпляра моего макета отдельно от этого слушателя.

Я попытался создать оператор if, изначально имеющий значение false для всего кода внутри переопределенного метода, но нет способа узнать, когда установить для него значение true, потому что переопределенный метод выполняется после методов onCreate(), OnStart() и onResume() каждый раз.

Я не нашел никаких четких ответов на этот вопрос. Мы были бы весьма признательны за любые четкие решения.

Переведено автоматически
Ответ 1

Дэвид, вот руководство, которое я написал для решения этой проблемы...

Постановка проблемы

нежелательный индикатор onItemSelected() запускается во время инициализации галереи (или счетчика). Это означает, что код выполняется преждевременно; код, который предназначен для выполнения ТОЛЬКО тогда, когда пользователь физически делает выбор.

Решение


  1. в onCreate () подсчитайте, сколько виджетов галереи (или счетчика) у вас есть в представлении. (mGalleryCount)

  2. в onItemSelected() подсчитайте, как часто он срабатывал. (mGalleryInitializedCount )

  3. когда (mGalleryInitializedCount < mGalleryCount) == false, тогда выполняется код, предназначенный для пользователя

Пример кода

public class myActivity extends Activity implements OnItemSelectedListener
{
//this counts how many Gallery's are on the UI
private int mGalleryCount=0;

//this counts how many Gallery's have been initialized
private int mGalleryInitializedCount=0;

//UI reference
private Gallery mGallery;


@Override
public void onCreate(Bundle savedInstanceState)
{

super.onCreate(savedInstanceState);
setContentView(R.layout.myxmllayout);

//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;

}


public void onItemSelected(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

Вот модифицированная версия кода "Кто-то где-то". Вы можете использовать его, если у вас есть единственное представление.

public class myActivity extends Activity implements OnItemSelectedListener
{
// Set view initialization to false while the it is being built
private boolean initializedView = false;

//UI reference
private Gallery mGallery;


@Override
public void onCreate(Bundle savedInstanceState)
{

super.onCreate(savedInstanceState);
setContentView(R.layout.myxmllayout);

//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
//


}


public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{

if (initializedView == false)
{
initializedView = true;
}
else
{
//only detect selection events that are not done whilst initializing
Log.i(TAG, "selected item position = " + String.valueOf(position) );
}

}
}
Ответ 3

То же решение:

private int m_intSpinnerInitiCount = 0;
private static final int NO_OF_EVENTS = 1;

...

m_spnTemplates.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(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 в конце кода макета. В моем прослушивателе я проверяю значение переменной, чтобы решить, выполнять код прослушивателя или нет.

java android