黑莓CheckBoxField中的Stackoverflow异常

时间:2012-12-13 19:20:12

标签: blackberry java-me blackberry-jde

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

  1. 所有类别都是CheckBoxField。用户必须至少选择一个类别。
  2. 选择所有CheckBox将允许选择全部/取消选择所有类别CheckBox。
  3. 如果用户手动选择所有复选框字段,则必须选中“全选”复选框。
  4. 方法:我在循环中创建了类别复选框。

    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”,但这不会有帮助,因为我希望字段监听器既实用又可以手动工作。我没有任何选择可以解决。任何黑客都会帮助我吗?

1 个答案:

答案 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

这可能会让你在其他地方减少迭代次数。

我还会更多地去除重复项和代码可读性。