【问题标题】:Undo spinner selection on some condition在某些条件下撤消微调器选择
【发布时间】:2016-02-22 21:02:01
【问题描述】:

也许是一个奇怪的问题。我有两个spinners,它们都适应来自同一个list 的值。最初,我将它们设置为不同的位置。我需要它们总是不同的,即用户永远不能在第一个 Spinner 中选择已经在第二个中选择的 String,反之亦然。我能想到的最简单的方法是:

 spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                                        int position, long id) {
                if (position == spinner2.getSelectedItemPosition()){
                     //UNDO OR CANCEL THE SELECTION SOMEHOW
                }

            }

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

            }
        });

问题是如何将微调器的选择撤消到前一个?是否有可能不保留全局变量?谢谢

【问题讨论】:

标签: java android spinner android-spinner


【解决方案1】:

您可以为此使用 Stack:

Stack<Integer> stack = new Stack<>();
boolean programaticalyChange = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
//Here initialize all you need
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if (programaticalyChange) {
                programaticalyChange = false;
            } else {
                stack.push(position);
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {}
    });
//I use button to pop stack back, but you can use any callback from second spinner
btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            programaticalyChange = true;
            if (queue.isEmpty()) {
                //no backstack available
                sp.setSelection(0);
            } else {
                if (queue.peek() == sp.getSelectedItemPosition()) queue.pop();
                sp.setSelection(queue.pop());
            }
        }
    });
}

【讨论】:

  • 有误会。如果第二个已经设置到那个位置,我需要设置微调器的位置。因此,我需要在 Spinner 点击时存储位置,但在触发 onItemSelected 之前,因为在这个函数中位置已经改变。堆栈在这个范围内不过是全局值,无论如何谢谢!我开始认为这是不可能的。
  • 我向你展示了如何为 spinner 实现完整的 backstack。位置改变之前没有回调,但是你可以扩展一个 Spinner 并添加这个功能。例如覆盖方法 performClick
【解决方案2】:

在您的 if 条件之前,在某个变量中获取先前选择的项目,如果您的条件为真,则使用此变量撤消您的选择。

【讨论】:

  • " get the previous selected item" 这就是问题所在,如何在不预先存储在全局变量中的情况下获取它?
  • 您可以使用 getter 和 setter 来完成。
  • 这就是所谓的设置全局变量。我问的是有可能没有
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多