18

我的 Android 应用程序中有一个微调器,它的onItemSelected()事件会在进入活动时自动触发。

我该如何避免这种情况?

4

9 回答 9

12

我们可以使用一个标志,并在真正触摸到微调器时启用它。

private boolean isSpinnerTouched = false; 

spinner.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                isSpinnerTouched = true;
                return false;
            }
        });
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> adapter, View arg1,
                        int arg2, long arg3) {
                    if (!isSpinnerTouched) return;
                    // do what you want 
                    }
        });
于 2014-06-25T03:27:56.757 回答
9

要添加 Jerry Abraham,您应该在启用 setOnItemSelectedListener 之前清除选择

  Spinner mSpinner=(Spinner)findViewById(R.id.mySpinner);
  int initialSelectedPosition=mSpinner.getSelectedItemPosition();
  mSpinner.setSelection(initialSelectedPosition, false); //clear selection
  mSpinner.setOnItemSelectedListener(this); //set listener after clearing section
于 2017-08-28T20:05:50.753 回答
8

我已经解决了这个问题,您可以通过不对微调器设置任何默认值来避免这个问题

        int initialposition=spinner.getSelectedItemPosition();
        spinner.setSelection(initialposition, false);

这将避免进入 onItemSelected()

于 2013-07-21T12:06:42.073 回答
5

没有任何方法可以避免这种情况。

您可以添加一些标志,表明您的应用程序已准备就绪,并在您的 onItemSelected() 方法中使用它来决定在每种情况下要做什么。

于 2011-03-20T11:38:32.203 回答
1

好吧,您可以向初始适配器添加一个虚拟选择,并忽略setOnItemSelectedListener. 它不漂亮,但它有效。请参阅此代码以设置阵列适配器的项目。

List<String> names = new ArrayList<String>();
names.add("");
names.addAll(realValues);

然后在你的setOnItemSelectedListener你可以这样做:

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
    {
        if (position > 0)
        {
            String name = names.get(position - 1);
        }
        else
        {
            Log.d(TAG, "selected nothing or perhaps the dummy value");
        }
    }
于 2014-03-10T18:11:35.807 回答
0

我找到了解决此问题的方法并将其发布在此处(带有代码示例):

Spinner onItemSelected() 在不应该执行时执行

于 2011-05-07T00:15:44.340 回答
0

这很简单……用布尔值验证是否是第一次……

Spinner mySpinner = (Spinner)findViewById(R.id.spinner_xml_pro);
        mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if(isSpinnerInitial){ // globar var boolean isSpinnerInitial = false;
                 //do something
               }else
                    isSpinnerInitial=true;
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

用 spinner.post(new Runnable()...) 或其他我的来源检查这个

于 2017-01-11T01:05:41.637 回答
0

我认为您可以使用微调器位置,在我看来这是一种更好的方法。创建一个存储微调器位置的全局变量,在 onItemSelected 方法中提供位置,您可以比较它们,如果它们相同,则不要执行操作。

    private int spinnerPosition; \\ Global variable

     mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
               if(spinnerPosition != position){
               // Do whatever you like

               // Do not forget to save the new position
                spinnerPosition = position;
               }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
于 2021-02-23T14:51:54.670 回答
-1

您可以通过忽略第一次点击来避免它,

private boolean isSpinnerInitial = true; //As global variable

public void onItemSelected(xxx xxx, xxx xxx, xxx xxx, xxx xxx) {
    if(isSpinnerInitial) {
        isSpinnerInitial = false;
        return;
    }
    // Write your code here
}
于 2019-01-22T13:02:29.743 回答