Android NumberPicker OnValueChangeListener

sch*_*hel 1 android valuechangelistener numberpicker

我有一个关于Android的问题NumberPicker.当用户在a上执行Fling时NumberPicker,OnValueChange触发Listener for的每一步.我可以通过这种方式更改它,oldVal和newVal可能相互之间的差异超过1,并且只触发一次Listener吗?

提前致谢.

编辑:我将尝试在我的代码中更具体地解释它.

        int diff = Math.abs(newVal - oldVal);

        if (newVal - oldVal > 0) {
            sendMessage(te);
            for (int i = 0; i < diff; i++) {
                sendMessage(plus);
            }
            sendMessage(te);
        } else if (newVal - oldVal < 0) {
            sendMessage(te);
            for (int i = 0; i < diff; i++) {
                sendMessage(minus);
            }
            sendMessage(te);
        } else {
            if (D)
                Log.w(TAG, "This should NEVER happen");
        }
Run Code Online (Sandbox Code Playgroud)

此方法称为inonValueChange.它发送的消息太快,无法让我连接的设备及时做出反应.所以我需要以任何方式放慢速度.有没有人知道如何减慢它,而不让我的主线程睡眠?当它处于休眠状态时,整个GUI在此期间没有响应.我尽量避免这种情况.

谢谢.

jpi*_*ado 7

而不是setOnValueChangedListener你可以使用setOnScrollListener,并在滚动状态时获取选择器的值SCROLL_STATE_IDLE.检查此示例:

    numberPicker.setOnScrollListener(new NumberPicker.OnScrollListener() {

        private int oldValue;  //You need to init this value.

        @Override
        public void onScrollStateChange(NumberPicker numberPicker, int scrollState) {
            if (scrollState == NumberPicker.OnScrollListener.SCROLL_STATE_IDLE) {
                //We get the different between oldValue and the new value
                int valueDiff = numberPicker.getValue() - oldValue;

                //Update oldValue to the new value for the next scroll
                oldValue = numberPicker.getValue();

                //Do action with valueDiff
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

请注意,您需要oldValue在侦听器中初始化变量的值.如果需要创建通用侦听器(可以接收任何值数组),则可以创建一个NumberPicker.OnScrollListener在构造函数中实现和接收初始值的自定义类.像这样的东西:

    public class MyNumberPickerScrollListener implements NumberPicker.OnScrollListener {

        private int oldValue;

        public MyNumberPickerScrollListener(int initialValue) {
            oldValue = initialValue;
        }

        @Override
        public void onScrollStateChange(NumberPicker numberPicker, int scrollState) {
            if (scrollState == NumberPicker.OnScrollListener.SCROLL_STATE_IDLE) {
                //We get the different between oldValue and the new value
                int valueDiff = numberPicker.getValue() - oldValue;

                //Update oldValue to the new value for the next scroll
                oldValue = numberPicker.getValue();

                //Do action with valueDiff
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读NumberPicker.onScrollListener文档.