Android下拉列表Spinner如何移除OnItemSelectedListener监听器

4

其他人遇到的问题是不起作用,而我的问题是它正在工作(而不应该)

我有一个数据模型,已保存,并需要加载回GUI和Activity。它有几个Spinner值。

数据被放置在一个公共可访问的类中,即引用持有者。

Activity的onCreate将检查是否处于编辑模式:

editMode = getIntent().getBooleanExtra(EDIT_MODE_KEY, false);

它将从xml加载UI元素,并开始选择、填充值。 在编辑模式和创建模式下,它应该选择具有数据模型的值。 在运行时(在onResume()之后)有一些工作流程:如果在spinner1中选择了某些内容,则应刷新spinner2适配器内容等。 由于简单的.setSelection(positiontoSelect)没有起作用,所以我添加了延迟发布,现在它可以工作了。
我的问题是:我想暂时删除选择监听器,调用选择操作,然后再添加回监听器。
以下是需要修改的代码:
          if (editedTimezonePosition > -1) {                        
                final int positiontoSelect = editedTimezonePosition;
                new Handler().postDelayed(new Runnable() {
                    public void run() {
                        OnItemSelectedListener listener = spSelectTimezone.getOnItemSelectedListener();
                        spSelectTimezone.setOnItemSelectedListener(null);
                        spSelectTimezone.setSelection(positiontoSelect);
                        spSelectTimezone.setOnItemSelectedListener(listener);                   
                    }
                }, 250);            
            }

将监听器设置为null没有效果:我仍然会收到我的监听器方法的回调。

如果您有任何解决方法,请分享!

1个回答

2

您可以在onItemSelected方法中放置一个计数器变量。如果它为0(表示该方法第一次被调用),则什么也不做,只需增加变量。如果它大于0,则执行其余的代码。

private int mSpinnerSelectionCount=0;

public void onItemSelected(AdapterView<?> parent, View view,
    int pos, long id) {
        if(mSpinnerSelectionCount == 0){
            mSpinnerSelectionCount++;
        } else {
            // Your normal selection code here
        }    
    }

+1,好主意。我会试一下。如何改进:我可以为 mSpinnerSelectionCount 编写一个 setter,通过这种方式修复 Android 操作系统中的错误? :) 当我需要禁用时,请使用值为 0 的 setter。 - user529543
1
实际上,在你的情况下,我会只是使用一个 boolean(配合你之前提到的setter方法)。我的示例方法是一个 int,因为我从一些现成的代码中提取出来的,我需要追踪spinner上选择的次数。 :) - Barak
它正在工作,我正在使用setter:设置为0、-1并检查是否小于1 :) - user529543

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接