【问题标题】:Android NumberPicker OnValueChangeListenerAndroid NumberPicker OnValueChangeListener
【发布时间】:2013-05-11 13:44:24
【问题描述】:

我有一个关于 Android NumberPicker 的问题。 当用户在 NumberPicker 上执行 Fling 时,每一步都会触发 OnValueChange 的侦听器。我可以这样改变吗,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");
        }

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

谢谢。

【问题讨论】:

    标签: android valuechangelistener numberpicker


    【解决方案1】:

    您可以使用setOnScrollListener 代替setOnValueChangedListener,并在滚动状态为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
                }
            }
        });
    

    请注意,您需要在侦听器中初始化 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
                }
            }
        }
    

    阅读NumberPicker.onScrollListener 文档了解更多信息。

    【讨论】:

    • 这还没有解决我的问题。我想做的是:只要它是一扔什么都不做。当它停止时,获取新值与投掷前值之间的差异。使用该值执行一些功能。此外,我想要相同的功能,当值仅通过单击而更改为 1 时,而不是一掷千金。每次以任何方式更改时,我都需要发送许多命令,这些命令与差异一样高。
    • 查看更新后的响应是否符合您需要实施的内容 ;-)
    • 2013 年添加,2021 年仍然有用 :)
    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2014-11-19
    • 2015-08-09
    相关资源
    最近更新 更多