我正在实施一个简单的应用程序,在注册页面中用户可以选择新闻类别。要求低于
方法:我在循环中创建了类别复选框。
for(int i=0;i<interests.length;i++){
allFields[i] = new ColorCheckBoxField(interests[i], false, checkBoxStyle | USE_ALL_WIDTH);
allFields[i].setCookie(i+"");
allFields[i].setFont(bodyFont);
allFields[i].setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
ColorCheckBoxField tempChoice = (ColorCheckBoxField)field;
int index =Integer.parseInt(tempChoice.getCookie().toString().trim());
//set the selection
if(tempChoice.getChecked()){
parent.selectInterest(index);
}
boolean flag = true;
int[] intrests = parent.getSelectedInterest();
for (int i = 0; i < intrests.length; i++) {
if(intrests[i]==0){
flag = false;
}
}
if(flag==true){
selectAll.setChecked(flag); // select all is Checkbox object
}else{
selectAll.setChecked(false);
}
}
});
vfm.add(allFields[i]);
}
我的selectAll复选框逻辑是
selectAll = new ColorCheckBoxField("Select All", false, checkBoxStyle | USE_ALL_WIDTH);
selectAll.setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
ColorCheckBoxField temp = (ColorCheckBoxField) field;
//if (context == FieldChangeListener.PROGRAMMATIC ) {
checkAll(temp.getChecked()); // it loops through all checkbox and set them checked
//}
}
});
innerHfm.add(selectAll);
我理解这个问题,它由于无限循环。我使用了“FieldChangeListener.PROGRAMMATIC”,但这不会有帮助,因为我希望字段监听器既实用又可以手动工作。我没有任何选择可以解决。任何黑客都会帮助我吗?
答案 0 :(得分:4)
你必须使用FieldChangeListener.PROGRAMMATIC
这是正确的。但您必须使用兴趣复选框,而不是将其用于selectAll
复选框。
请为FieldChangeListener
添加一张防御性支票,以获取兴趣复选框:
if ( nonProgrammaticChange(context) ) {
ColorCheckBoxField tempChoice = (ColorCheckBoxField)field;
int index = Integer.parseInt(tempChoice.getCookie().toString().trim());
...
}
nonProgrammaticChange
的位置:
private boolean nonProgrammaticChange (int context) {
return (context & FieldChangeListener.PROGRAMMATIC) != FieldChangeListener.PROGRAMMATIC;
}
我在你的代码中看到了错误 - 如果取消选中复选框,你就不会对父母产生兴趣。
对我来说是次要的改进 - 使用Vector来存储所选复选框的索引。这将允许替换此代码:
boolean flag = true;
int[] intrests = parent.getSelectedInterest();
for ( int i = 0; i < intrests.length; i++ ) {
if( intrests[i] == 0 ) {
flag = false;
}
}
到此代码:
selectedInterestIndexes.size() == interests.length
这可能会让你在其他地方减少迭代次数。
我还会更多地去除重复项和代码可读性。