Java 在某些条件下撤消微调器选择

Java 在某些条件下撤消微调器选择,java,android,spinner,android-spinner,Java,Android,Spinner,Android Spinner,也许是个奇怪的问题。我有两个微调器,它们都从相同的列表中调整值。最初,我将它们设置为不同的位置。我需要它们总是不同的,即用户永远不能在第一个微调器中选择第二个中已选择的字符串,反之亦然。我能想到的最简单的方法是: spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(Ada

也许是个奇怪的问题。我有两个
微调器
,它们都从相同的
列表
中调整值。最初,我将它们设置为不同的位置。我需要它们总是不同的,即用户永远不能在第一个
微调器中选择第二个中已选择的
字符串,反之亦然。我能想到的最简单的方法是:

 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) {

            }
        });
spinner1.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图、,
内部位置,长id){
if(位置==喷丝头2.getSelectedItemPosition()){
//以某种方式撤消或取消选择
}
}
@凌驾
未选择公共无效(AdapterView父级){
}
});

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

您可以使用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());
            }
        }
    });
}
Stack Stack=新堆栈();
布尔编程更改=false;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//这里初始化您所需要的一切
spinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
如果(编程更改){
编程更改=错误;
}否则{
堆栈。推(位置);
}
}
@凌驾
未选择的公共无效(AdapterView父项){}
});
//我使用按钮弹出堆栈,但您可以使用来自第二个微调器的任何回调
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
编程更改=真;
if(queue.isEmpty()){
//没有后援可用
sp.1(0);
}否则{
如果(queue.peek()==sp.getSelectedItemPosition())queue.pop();
sp.setSelection(queue.pop());
}
}
});
}

您可以使用堆栈进行此操作:

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());
            }
        }
    });
}
Stack Stack=新堆栈();
布尔编程更改=false;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//这里初始化您所需要的一切
spinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
如果(编程更改){
编程更改=错误;
}否则{
堆栈。推(位置);
}
}
@凌驾
未选择的公共无效(AdapterView父项){}
});
//我使用按钮弹出堆栈,但您可以使用来自第二个微调器的任何回调
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
编程更改=真;
if(queue.isEmpty()){
//没有后援可用
sp.1(0);
}否则{
如果(queue.peek()==sp.getSelectedItemPosition())queue.pop();
sp.setSelection(queue.pop());
}
}
});
}

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

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

有关提示,请参阅此处或此处谢谢,但问题是关于“撤销”的可能性。我可以在几个条件下通过全局变量解决它,但是如果我们可以通过android sdk实现“撤销”功能,那就非常有趣了,无论如何,谢谢你的时间!请参见此处获得一些提示或此处谢谢,但问题是关于“撤消”的可能性。我可以在几个条件下通过全局变量解决它,但是如果我们可以通过android sdk实现“撤销”功能,那就非常有趣了,无论如何,谢谢你的时间!有误解。如果第二个旋转器已经设置为该位置,我需要将旋转器的位置向后设置。因此,我需要在微调器单击时存储位置,但在触发onItemSelected之前,因为在此函数中位置已更改。堆栈在这个范围内,除了全局值,没有别的,无论如何,谢谢!我开始认为这是不可能的。我将向您展示如何实现spinner的完全后退。位置更改之前没有回调,但可以扩展微调器并添加此功能。例如,重写方法PerformClick存在误解。如果第二个旋转器已经设置为该位置,我需要将旋转器的位置向后设置。因此,我需要在微调器单击时存储位置,但在触发onItemSelected之前,因为在此函数中位置已更改。堆栈在这个范围内,除了全局值,没有别的,无论如何,谢谢!我开始认为这是不可能的。我将向您展示如何实现spinner的完全后退。位置更改之前没有回调,但可以扩展微调器并添加此功能。例如,override方法performClick“获取先前选择的项”这是一个问题,我如何在不将其预先存储在全局变量中的情况下获取它?您可以使用getter和setters来实现。这称为设置全局变量。我想问的是,没有“获取先前选择的项目”是可能的,这是一个问题,我如何在不将其预先存储在全局变量中的情况下获取它?您可以使用getter和setter来实现。这就是所谓的设置全局变量。我在问,没有它也行吗