2013-05-16 3 views
1

Android NumberPicker에 관한 질문이 있습니다. 사용자가 NumberPicker에서 Fling을 수행 할 때마다 매 단계마다 OnValueChange에 대한 Listener가 트리거됩니다. oldVal과 newVal이 서로 1을 초과하여 서로 다를 수 있고 Listener가 한 번만 트리거된다는 것을 이렇게 변경할 수 있습니까?Android NumberPicker OnValueChangeListener

미리 감사드립니다.

편집 : 나는 더 구체적으로 내 코드에서 설명하려고합니다.

 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 일 때 선택 도구의 값을 얻을 수 있습니다. 당신이 청취자의 oldValue 변수의 값을 초기화하기 위해서 필요

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 
      } 
     } 
    }); 

참고 :이 예제를 확인하십시오. 모든 값 배열을받을 수있는 일반 리스너를 만들어야하는 경우 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