2012-12-13 2 views
1

Я реализую простое приложение, где на странице регистрации пользователь может выбрать категории новостей. Требования нижеИсключение Stackoverflow в Blackberry CheckBoxField

  1. Все категории являются CheckBoxField. Пользователь должен выбрать хотя бы одну категорию.
  2. Выбрать все CheckBox позволит выбрать все/отменить выбор всех категорий CheckBox.
  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

Это правильно, что вы должны использовать 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 

И, вероятно, это даст вам меньше итераций в других местах.

Так же, я бы больше работал над удалением дубликатов и удобочитаемости кода.

+0

@Eugen .. Определенно +1 ответ. ты спас мой день. –

+0

@SmartTechie спасибо за вопрос такой вопрос .. –

+0

@Eugen спасибо за ответ –

Смежные вопросы