0

私はコンバーターを開発していて、その目的のために2つのAndroidホイールインスタンスを持っています。ユーザーが1つのホイールをスクロールすると、2番目のホイールは自動的に計算し、2番目のホイールのデータをその結果に変更する必要があります。そして、これはその逆に起こるはずです。

これに伴う問題は、ホイールがスクロールされて変更されているとき、スクロールされたリスナーと変更されたリスナーが毎回呼び出され、これがStackOverFlowErrorを引き起こしているため、ロジックが循環的であるということです。

ユーザーが最初のホイールをスクロールしたときに、2番目のホイールを変換して日付を設定するにはどうすればよいですか?およびその逆。

コード:

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

2 に答える 2

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;
      }
   }
};
于 2012-07-24T16:25:34.327 に答える
0

ユーザーがスクロールを開始すると、カウントダウン タイマーが起動します。各増分で必要な計算と調整を定期的に行います。つまり、すべてのスクロール変更イベントをキャッチする必要はありません。カウントダウンタイマーがまだ開始されていない場合は、キャッチしてキックオフしてください。次に、スクロール位置を確認し、それに応じて調整します。

于 2012-07-20T22:57:11.537 に答える