2017-02-16 1 views
0

ayant quelques case à cocher dynamiquement gonflé/ajouté, quand certains sont vérifiés la rotation ou de minimiser l'application (pour faciliter le déclenchement de l'affaire, allumer le 'Ne pas garder l'activité en vie '), la vue de l'interface utilisateur restaurée affiche toutes les cases cochées. Lorsque os saveInstance stocke les éléments cochés dans une liste, et lorsque le système d'exploitation pour restaurer le fragment, nous obtenons la liste des éléments cochés et lorsque la case checkbox est appelée, elle appelle setChecked (true) ou setChecked (false) basé sur la liste. Mais après cela, toute la case à cocher affiche comme cochée, bien que dans le débogage il montre clairement que les vérifiés sont utilisés 'vrai' et d'autres sont utilisés 'faux' avec setChecked().pourquoi le checkBox est vérifier quand setChecked (faux) est appelé

N'importe qui a connu la même chose, ou sait pourquoi setChecked() sur l'instance checkBox individuelle ne fait pas ce qu'on appelle?

itemList = [A, B, C, D, E]

checkedListSet = [A, B]

void insertOneRow(ViewGroup container, Item item) { 

    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View itemLayout = inflater.inflate(R.layout.item_row, null, false); 

    TextView txt = (TextView)itemLayout.findViewById(R.id.text); 
    txt.setText(item.toString());   
    container.addView(itemLayout, container.getChildCount()); 

    CheckBox checkbox = (CheckBox)itemLayout.findViewById(R.id.checkbox); 
    if (checkbox != null) { 
     boolean isChecked = (checkedListSet.get(item) != null); 

     Log.i(“insertOneRow(), isChecked:"+ isChecked +", item:”+item); 

     checkbox.setChecked(isChecked); //<== trace shows only A and B are set with true 
    } 
} 

item_row.xml

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="36dp" 
    android:orientation="horizontal" 
> 

    <CheckBox 
     android:id="@+id/checkbox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:checked="false"   /> 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"    
    /> 

</LinearLayout> 
+0

Quel est le type de 'checkedListSet' objet? Je pense que la méthode get sur une liste n'accepte qu'un int en tant qu'index. –

+0

checkedList est juste une liste contient l'élément vérifié, pourrait être ListArray ou HashSet , le checkedListSet.get (point)! = Null est Je veux juste dire que si l'élément existe dans la checklist alors le checkBox doit définir vrai. – lannyf

Répondre

0
checkedListSet.get(item) != null 

Cette méthode retournera vrai s'il y a un élément dans votre liste et ce n'est pas nul.

Vous affectez le résultat de cette expression à votre booléen isChecked.

Ainsi, chaque fois que cette expression renvoie la valeur true, votre case à cocher sera setChecked true.

Je ne sais pas quelle condition exacte vous voulez vérifier avant de mettre la case à cocher, donc je ne peux pas vous aider avec cela.

+0

voir mon commentaire ci-dessus.Ce n'est pas du vrai code courant, il essaie juste de dire si l'item était dans la checkList alors le checkBox sera mis à true. – lannyf

0

encore pas sûr pourquoi, mais après avoir mis en android: saveEnabled = "faux" le même code commence à travailler. Est-ce que quelqu'un sait pourquoi il doit avoir android: saveEnabled = "false"?

<CheckBox 
     android:saveEnabled="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     /> 
0

La raison pour laquelle toutes vos cases à cocher sont SOYEZ PROACTIF est qu'ils ont tous la même id. Si l'un d'entre eux est vérifié et qu'ils sont recréés (soit en raison d'un changement d'orientation, soit en rattachant un fragment), le système Android tente de restaurer leur état et les identifie en fonction de leurs identifiants. Par conséquent, tous sont contrôlés. C'est un bug dans Android. Le drapeau indique au système Android s'il doit enregistrer son état et tenter de le restaurer plus tard ou non.

Étant donné que vous avez déjà un mécanisme en place pour restaurer leurs paramètres d'état android:saveEnabled à faux pour vous.

Voir cette question où une chose semblable se produit avec EditText: Why does Android change the value of EditTexts with same id?