2012-07-20 3 views
0

나는 변환기를 개발하고 그 목적을 위해 두 개의 안드로이드 휠 인스턴스가 있습니다. 사용자가 하나의 휠을 스크롤하면 두 번째 휠이 자동으로 두 번째 휠의 데이터를 계산하고 그 결과로 변경해야합니다. 그리고 이것도 마찬가지입니다.첫 번째 스크롤 할 때 안드로이드 휠 스크롤 초침

이 문제는 바퀴가 스크롤되고 변경 될 때 논리가 주기적이며, 스크롤 된 수신기와 변경된 수신기가 매번 호출되어 StackOverFlowError가 발생하는 것입니다.

어떻게하면 두 번째 휠을 변환하고 사용자가 첫 번째 스크롤 할 때 날짜를 설정할 수 있습니까? 그 반대.

코드 :

@Override 
public void onCreate(Bundle savedInstanceState) { 

    ...... 


    changedlistener = new OnWheelChangedListener() { 
     public void onChanged(WheelView wheel, int oldValue, int newValue) { 

     if (wheel.getId() == R.id.month || wheel.getId() == R.id.day || wheel.getId() == R.id.year) { 
       updateDays(year, month, day); 
     } else if (wheel.getId() == R.id.hijrimonth || wheel.getId() == R.id.hijriday || wheel.getId() == R.id.hijriyear) { 
       hijriDays(hijriyear, hijrimonth, hijriday); 
     } 


     } 
    }; 

    .....scrolledlistener event...... 

    // month 

    month.addChangingListener(changedlistener); 
    month.addScrollingListener(scrolledlistener); 

    // year 
    year.addChangingListener(changedlistener); 
    year.addScrollingListener(scrolledlistener); 


    //day 
    day.addChangingListener(changedlistener); 
    day.addScrollingListener(scrolledlistener); 

    hijrimonth.addChangingListener(changedlistener); 
    hijrimonth.addScrollingListener(scrolledlistener); 

    hijriyear.addChangingListener(changedlistener); 
    hijriyear.addScrollingListener(scrolledlistener); 

    hijriday.addChangingListener(changedlistener); 
    hijriday.addScrollingListener(scrolledlistener); 

} 

/** 
* Updates day wheel. Sets max days according to selected month and year 
*/ 
void updateDays(WheelView year, WheelView month, WheelView day) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + year.getCurrentItem()); 
    calendar.set(Calendar.MONTH, month.getCurrentItem()); 

    int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
    day.setViewAdapter(new DateNumericAdapter(this, 1, maxDays, calendar.get(Calendar.DAY_OF_MONTH) - 1)); 
    int curDay = Math.min(maxDays, day.getCurrentItem() + 1); 
    day.setCurrentItem(curDay - 1, true); 
    int curYear = calendar.get(Calendar.YEAR); 
    year.setCurrentItem(curYear); 
    text.setText((day.getCurrentItem()+1) + " " + getMonthAsString(month.getCurrentItem()) + " " +year.getCurrentItem()); 
    //setHijri(year.getCurrentItem(), month.getCurrentItem(), day.getCurrentItem()); 
} 

void hijriDays(WheelView year, WheelView month, WheelView day) { 

    hijritext.setText((day.getCurrentItem()+1) + " " + hijri.getHijriMonthName(month.getCurrentItem()+1) + " " + year.getCurrentItem()); 
    setGreg(year.getCurrentItem(), month.getCurrentItem(), day.getCurrentItem()); 
} 

public void setGreg(int y, int m, int d) { 
    hdate = hijri.islToGreg(y, m, d, 0); 
    hmonth = hdate[1]; 
    hyear = hdate[2]; 
    hday = hdate[0]; 

    month.setCurrentItem(hmonth); 
    day.setCurrentItem(hday); 
    year.setCurrentItem(hyear); 

} 

public void setHijri(int y, int m, int d) { 
    hdate = hijri.GregToIsl(y, m, d, 0); 
    hmonth = hdate[1]; 
    hyear = hdate[2]; 
    hday = hdate[0]; 

    hijrimonth.setCurrentItem(hmonth); 
    hijriday.setCurrentItem(hday); 
    hijriyear.setCurrentItem(hyear); 
} 

답변

2

나는 휠에서 중복 이벤트를 건너 뛰는 플래그를 사용하는 것이 가장 좋은 해결책이라고 생각합니다. 다음과 같은 항목 :

+0

작은 수정 : if (inProgress) {return; } – kankan

0

사용자가 시작에게 카운트 다운 타이머를 스크롤 시작합니다. 각 증분마다 필요한 계산과 조정을 주기적으로하십시오. 즉 스크롤 변경 이벤트를 모두 잡을 필요가 없습니다. 카운트 다운 타이머가 시작되지 않았다면 카운트 다운 타이머를 시작할 수 있습니다. 그런 다음 스크롤 위치를 확인하고 그에 따라 조정하십시오.

+0

샘플 코드를 보내 주시면 감사하겠습니다. – input

관련 문제