java - Android 滚轮在第一个滚轮滚动时滚动第二个滚轮

标签 java 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);
}

最佳答案

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

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

关于java - Android 滚轮在第一个滚轮滚动时滚动第二个滚轮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11587864/

相关文章:

java - 将 Toast 与 BufferedReader 一起使用

java - API - 如何让 API 用户声明自己的类型(然后由 API 使用)?

java - 将 onCreate 方法中的值解析到公共(public)类

android - 当两个设备连接到系统时无法在设备上部署 phonegap 应用程序

java - Android:扩展 ActionBarActivity 会使应用程序崩溃

java - 三元运算符中的多个语句

当我释放的数量超过获取的数量时,Java 信号量会增加许可数量

java - Selenium moveToElement() 不起作用

java - 在子类中创建打印父类(super class)方法的方法?

android - Android 应用程序崩溃时处理对象的正确方法是什么?