Android Spinner选择

Aru*_*tha 23 android selection spinner

当以编程方式更改微调器选择时,以及当用户物理单击微调器控件时,都会调用OnItemSelectedListener事件处理程序.是否可以确定某个事件是否由用户选择以某种方式触发?

或者是否有另一种方法来处理微调器用户选择?

Vit*_*nko 49

要解决此问题,您需要记住最后选择的位置.然后在您的微调器侦听器内部将最后选择的位置与新位置进行比较.如果它们不同,则处理事件并使用新的位置值更新最后选择的位置,否则只需跳过事件处理.

如果在代码中的某个位置,您将以编程方式更改微调器选定的位置,并且您不希望侦听器处理该事件,则只需将最后选择的位置重置为您要设置的位置.

是的,Android中的Spinner很痛苦.我甚至会说疼痛从它的名字开始 - "Spinner".是不是有点误导?:)就我们所说的而言,你也应该知道有一个错误 - Spinner可能无法恢复(并不总是)它的状态(在设备旋转时),因此请确保手动处理Spinner的状态.


Amo*_*ter 20

很难相信一年半之后,这个问题仍然存在并继续让人们陷入困境......

我想在阅读Arhimed最有用的帖子之后我想出了解决方法(谢谢,我同意旋转器很痛苦!).我一直在做的是避免这些误报是使用一个简单的包装类:

import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;

public class OnItemSelectedListenerWrapper implements OnItemSelectedListener {

    private int lastPosition;
    private OnItemSelectedListener listener;

    public OnItemSelectedListenerWrapper(OnItemSelectedListener aListener) {
        lastPosition = 0;
        listener = aListener;
    }

    @Override
    public void onItemSelected(AdapterView<?> aParentView, View aView, int aPosition, long anId) {
        if (lastPosition == aPosition) {
            Log.d(getClass().getName(), "Ignoring onItemSelected for same position: " + aPosition);
        } else {
            Log.d(getClass().getName(), "Passing on onItemSelected for different position: " + aPosition);
            listener.onItemSelected(aParentView, aView, aPosition, anId);
        }
        lastPosition = aPosition;
    }

    @Override
    public void onNothingSelected(AdapterView<?> aParentView) {
        listener.onNothingSelected(aParentView);
    }
}
Run Code Online (Sandbox Code Playgroud)

它所做的就是为已经选择的相同位置捕获项目选定事件(例如,位置0的初始自动触发选择),并将其他事件传递给包装的侦听器.要使用它,您所要做的就是修改代码中调用侦听器的行以包含包装器(当然还要添加结束括号),所以不要说:

mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    ...
});
Run Code Online (Sandbox Code Playgroud)

你有这个:

mySpinner.setOnItemSelectedListener(new OnItemSelectedListenerWrapper(new OnItemSelectedListener() {
    ...
}));
Run Code Online (Sandbox Code Playgroud)

显然,一旦你测试了它,就可以摆脱Log调用,你可以添加重置最后一个位置的能力(当然,你必须保留对实例的引用,而不是声明正如Arhimed所说的那样.

希望这可以帮助某些人被这种奇怪的行为所驱使;-)