如何防止 onItemSelected 在新实例化的 Spinner 上触发? [英] How to keep onItemSelected from firing off on a newly instantiated Spinner?

查看:23
本文介绍了如何防止 onItemSelected 在新实例化的 Spinner 上触发?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想过一些不太优雅的方法来解决这个问题,但我知道我一定遗漏了一些东西.

I've thought of some less than elegant ways to solve this, but I know I must be missing something.

我的 onItemSelected 立即触发而不与用户进行任何交互,这是不受欢迎的行为.我希望 UI 在执行任何操作之前等待用户选择某些内容.

My onItemSelected fires off immediately without any interaction with the user, and this is undesired behavior. I wish for the UI to wait until the user selects something before it does anything.

我什至尝试在 onResume() 中设置监听器,希望这会有所帮助,但它没有.

I even tried setting up the listener in the onResume(), hoping that would help, but it doesn't.

如何在用户触摸控件之前阻止它触发?

How can I stop this from firing off before the user can touch the control?

public class CMSHome extends Activity { 

private Spinner spinner;

@Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Heres my spinner ///////////////////////////////////////////
    spinner = (Spinner) findViewById(R.id.spinner);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            this, R.array.pm_list, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    };

public void onResume() {
    super.onResume();
    spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
}

    public class MyOnItemSelectedListener implements OnItemSelectedListener {

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

     Intent i = new Intent(CMSHome.this, ListProjects.class);
     i.putExtra("bEmpID", parent.getItemAtPosition(pos).toString());
        startActivity(i);

        Toast.makeText(parent.getContext(), "The pm is " +
          parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
    }

    public void onNothingSelected(AdapterView parent) {
      // Do nothing.
    }
}
}

推荐答案

Runnables 的使用完全不正确.

The use of Runnables is completely incorrect.

setOnItemSelectedListener(listener)之前的初始选择中使用setSelection(position, false);

Use setSelection(position, false); in the initial selection before setOnItemSelectedListener(listener)

通过这种方式,您可以在没有动画的情况下设置选择,这会导致调用 on item selected 侦听器.但是侦听器为空,因此没有运行任何内容.然后你的听众被分配.

This way you set your selection with no animation which causes the on item selected listener to be called. But the listener is null so nothing is run. Then your listener is assigned.

所以按照这个确切的顺序:

So follow this exact sequence:

Spinner s = (Spinner)Util.findViewById(view, R.id.sound, R.id.spinner);
s.setAdapter(adapter);
s.setSelection(position, false);
s.setOnItemSelectedListener(listener);

这篇关于如何防止 onItemSelected 在新实例化的 Spinner 上触发?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆