Java 微调器onItemSelected()执行不正确
可能重复:Java 微调器onItemSelected()执行不正确,java,android,Java,Android,可能重复: 有人知道如何防止在实例化布局时运行onItemSelected()(OnItemSelectedListener接口)方法吗?我需要知道是否有一种方法可以做到这一点,因为我想让我如何实例化我的布局与这个侦听器分开 我尝试在重写方法的所有代码周围创建一个初始设置为false的if语句,但无法知道何时将其设置为true,因为重写方法每次都在onCreate()、onStart()和onResume()方法之后运行 我没有找到任何明确的答案。任何明确的解决方案都将不胜感激。我昨天在OnC
有人知道如何防止在实例化布局时运行onItemSelected()(OnItemSelectedListener接口)方法吗?我需要知道是否有一种方法可以做到这一点,因为我想让我如何实例化我的布局与这个侦听器分开 我尝试在重写方法的所有代码周围创建一个初始设置为false的if语句,但无法知道何时将其设置为true,因为重写方法每次都在onCreate()、onStart()和onResume()方法之后运行
我没有找到任何明确的答案。任何明确的解决方案都将不胜感激。我昨天在OnCheckedChangedListener中遇到了这个问题。最后,我使用访问器方法isListenerEnabled()在适配器类中添加了一个初始化为true的布尔实例变量。然后在布局代码中将变量设置为false,并在布局代码末尾再次将其设置为true。在我的监听器中,我检查变量的值以决定是否执行监听器代码。David,下面是我为这个问题编写的教程 问题陈述 库(或微调器)初始化时会触发不需要的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) );
}
}
}
公共类myActivity扩展活动实现OnItemSelectedListener
{
//这会计算用户界面上有多少个图库
private int mGalleryCount=0;
//这会计算已初始化的库数
private int mGalleryInitializedCount=0;
//用户界面引用
私人画廊;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.myxmllayout);
//获取对UI组件的引用
mGallery=(画廊)findViewById(R.id.mygallery);
//来自图库的陷阱选择事件
mGallery.setOnItemSelectedListener(此);
//无抛投时仅陷阱选择
mGallery.setCallbackDuringFling(false);
//
//执行其他操作,如加载映像、setAdapter()等
//
//定义此视图中的库数量
//注意:如果以编程方式创建视图,则可以动态计算该值
mGalleryCount=1;
}
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id)
{
if(mGalleryInitializedCount
为什么这样做
此解决方案之所以有效,是因为库在用户能够进行选择之前很久就完成了初始化。每次调用
onPause
时,您都可以将变量设置回false
。
至于何时将其设置为
true
,您可以在onResume
之后的第一次运动/按键/轨迹球事件中执行此操作,这里是“某人某处”代码的修改版本。如果只有一个视图,则可以使用它
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) );
}
}
}
公共类myActivity扩展活动实现OnItemSelectedListener
{
//在生成视图时,将视图初始化设置为false
私有布尔初始化视图=false;
//用户界面引用
私人画廊;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.myxmllayout);
//获取对UI组件的引用
mGallery=(画廊)findViewById(R.id.mygallery);
//来自图库的陷阱选择事件
mGallery.setOnItemSelectedListener(此);
//无抛投时仅陷阱选择
mGallery.setCallbackDuringFling(false);
//
//执行其他操作,如加载映像、setAdapter()等
//
}
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id)
{
如果(initializedView==false)
{
initializedView=true;
}
其他的
{
//仅检测初始化时未完成的选择事件
Log.i(标记,“所选项目位置=“+String.valueOf(位置));
}
}
}
相同的解决方案:
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
}
}
private int m_intSpinnerInitiCount=0;
事件的私有静态最终整数编号=1;
...
m_spnTemplates.setOnItemSelectedListener(新的微调器.OnItemSelectedListener()){
@凌驾
已选择公共视图(AdapterView父视图,
视图selectedItemView,整数位置,长id){
//试图避免意外的微调器选择更改事件,这是一个已知问题
if(m_intSpinnerInitiCount<无事件){
m_intSpinnerInitiCount++;
}否则{
//你的代码在这里
}
}
我还在互联网上寻找一个好的解决方案,但没有找到任何能满足我需求的解决方案。
因此,我在Spinner类上编写了这个扩展,因此您可以设置一个简单的Listener,它与ListView具有相同的行为
只有当一个项目被“选中”时,才会调用McClickListener
玩得开心
public class MySpinner extends Spinner
{
private OnItemClickListener onItemClickListener;
public MySpinner(Context context)
{
super(context);
}
public MySpinner(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public MySpinner(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener inOnItemClickListener)
{
this.onItemClickListener = inOnItemClickListener;
}
@Override
public void onClick(DialogInterface dialog, int which)
{
super.onClick(dialog, which);
if (this.onItemClickListener != null)
{
this.onItemClickListener.onItemClick(this, this.getSelectedView(), which, this.getSelectedItemId());
}
}
}