1

我正在实现一个简单的应用程序,用户可以在注册页面中选择新闻类别。要求如下

  1. 所有的类别都是 CheckBoxField 的。用户必须至少选择一个类别。
  2. 全选复选框将允许选择所有/取消选择所有类别复选框。
  3. 如果用户手动选择所有复选框字段,则必须选中“全选”复选框。

方法:我在循环中创建了类别复选框。

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”,但这无济于事,因为我希望现场侦听器既实用又手动地工作。我没有任何选择可以修复。任何黑客都会帮助我吗?

4

1 回答 1

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

也许这会让你在其他地方的迭代更少。

同样,我会在删除重复项和代码可读性方面做更多工作。

于 2012-12-13T20:09:56.300 回答