gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:41:04 25 4
gpt4 key购买 nike

我正在开发一个转换器,并且为此目的我有两个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com