Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 微调器onItemSelected()执行不正确_Java_Android - Fatal编程技术网

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()。 这意味着代码被过早执行;仅当用户实际做出选择时才执行的代码

解决方案

  • 在onCreate()中,计算视图中有多少个Gallery(或微调器)小部件。(mGalleryCount)
  • 在onItemSelected()中,计算它触发的频率。(mGalleryInitializedCount)
  • 当(mGalleryInitializedCount 代码示例

    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());
            }
        }
    }