2013-05-16 2 views
1

У меня есть вопрос относительно Android NumberPicker. Когда пользователь выполняет Fling на NumberPicker, для каждого отдельного шага запускается приемник для OnValueChange. Могу ли я изменить это таким образом, что oldVal и newVal могут отличаться более чем на 1 друг от друга, а Listener запускается только один раз?Android NumberPicker OnValueChangeListener

Заранее спасибо.

EDIT: Я попытаюсь объяснить это более конкретно в моем коде.

 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 не реагирует в течение этого времени. Я стараюсь избегать этого.

Спасибо.

ответ

5

Вместо 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 
      } 
     } 
    }); 

Обратите внимание, что вам нужно инициализировать значение для 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 для получения дополнительной информации.

+0

Это еще не решило мою проблему. Я хочу сделать это: до тех пор, пока он бросает вызов, ничего не делайте. Когда он перестает получать разницу между новым значением и значением перед броском. Сделайте некоторую функцию с этим значением. Кроме того, мне нужна такая же функциональность, когда значение изменяется только на 1 щелчком мыши и без него. Мне нужно отправить несколько команд, которые отличаются от разницы, каждый раз, когда они каким-либо образом изменены. – schorschel

+0

Посмотрите, соответствует ли обновленный ответ тому, что вам нужно реализовать ;-) – jpintado

Смежные вопросы