可能重复:
Android Spinner OnItemSelected Called Erroneously (without user action on opening spinner)
当布局被实例化时,有人知道如何防止onItemSelected() (OnItemSelectedListener接口)方法运行吗?我需要知道是否有办法做到这一点,因为我希望将我的布局实例化方式与这个侦听器分开。
我尝试在重写方法中的所有代码周围创建一个最初设置为false的if语句,但是无法知道何时将其设置为true,因为重写的方法每次运行在onCreate()、onStart()和onResume()方法之后。
关于这一点,我没有找到明确的答案。任何明确的解决方案都将不胜感激。
发布于 2011-05-07 00:00:09
大卫,这是我为这个问题写的教程.
问题陈述
当库(或旋转器)正在初始化时,会触发一个不受欢迎的onItemSelected()。这意味着代码是过早地执行的;代码只在用户实际做出选择时才会执行。
溶液
的代码
代码示例
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) );
}
}
}为什么这样做,
此解决方案之所以有效,是因为库在用户进行物理选择之前很久就完成了初始化。
发布于 2011-09-16 23:51:23
这里是一个修改版本的“某人某处”的代码。如果您有一个视图,您可以使用它。
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) );
}
}
}发布于 2011-10-05 10:41:53
同样的解决办法:
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
}
}https://stackoverflow.com/questions/5624825
复制相似问题