2012-07-20 59 views
0

我正在开发一个转换器,我有两个Android轮子实例。当用户滚动一个车轮时,第二个车轮应自动计算并将第二个车轮的数据更改为该结果。反之亦然。Android滚轮滚动第一轮滚动第一轮时

问题是,当轮子滚动和更改时,逻辑是循环的,每次都会调用滚动的侦听器和更改的侦听器,这会导致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

我认为最好的解决方案是使用一个标志来从轮子上跳过重复的事件;像下一样:

changedlistener = new OnWheelChangedListener() { 
    boolean inProgress = false; 

    public void onChanged(WheelView wheel, int oldValue, int newValue) { 

    if (!inProgress) { 
     return; 
    } 
    inProgress = true; 

    try { 
     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); 
     } 
     } 
     finally { 
      inProgress = false; 
     } 
    } 
}; 
+0

小修正:if(inProgress){return; } – kankan 2012-07-26 09:21:04

0

当用户开始滚动启动一个倒数计时器。定期对每个增量进行计算和调整。换句话说,您不需要捕捉每个滚动更改事件。如果它还没有开始,赶上开始倒数计时器。然后检查滚动位置并相应地进行调整。

+0

示例代码将不胜感激。 – input 2012-07-20 23:24:25