Spinner onItemSelected()执行不当

Dav*_*id 43 java android

可能重复:
Android Spinner OnItemSelected错误调用(无需用户操作打开微调器)

有没有人知道如何在实例化布局时阻止onItemSelected()(OnItemSelectedListener接口)方法运行?我需要知道是否有办法做到这一点,因为我想保持我如何实例化我的布局与该侦听器分开.

我已经尝试在重写方法内部的所有代码周围创建一个最初设置为false的if语句,但是无法知道何时将其设置为true,因为重写的方法在onCreate(),onStart()之后运行,并且每次onResume()方法.

我没有找到任何明确的答案.任何明确的解决方案将不胜感激.

Som*_*ere 64

大卫,这是我为这个问题写的教程......

问题陈述

在Gallery(或Spinner)初始化时触发了一个不需要的onItemSelected().这意味着代码过早地执行; 仅在用户进行物理选择时才执行的代码.

  1. 在onCreate()中,计算视图中有多少个Gallery(或Spinner)小部件.(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) );
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

为什么会这样

此解决方案有效,因为Gallery在用户实际进行选择之前很久就完成了初始化.

  • 答案为+1.只是注释变量`mSpinnerCount`和`mSpinnerInitializedCount`可以更精确.虽然你在括号中提到了Spinner,但我被'Gallery`丢了一下. (2认同)

Kal*_*mah 13

这是"Someone Somewhere"代码的修改版本.如果您有一个视图,则可以使用它.

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

}
}
Run Code Online (Sandbox Code Playgroud)


Dim*_*man 11

相同解决方案

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
                    }                           
            }
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

30172 次

最近记录:

8 年,1 月 前