Comment puis-je gérer onClickListener d'un bouton dynamique créé?

doux:

Je suis en train de créer des boutons « n » en fonction de l'utilisateur de l'option a sélectionné. Les boutons peuvent varier de 1 à 3. Cependant, je vais avoir du mal lorsque je tente de mettre à jour la variable en fonction de la touche enfoncée. Il donne l'erreur « Variable utilisée dans l'expression lambda devrait être définitive ou efficace finale ». Je comprends l'erreur mais ne peut pas comprendre comment je peux résoudre ce problème. Voici mon exemple de code:

        for (int i = 0; i < options; i++) {
            Button button = new Button(this);
            button.setId(position);
            buttons[i] = button;
            buttons[i].setOnClickListener(v -> {
                tempToMaintain.setValue(listParameters.get(i));

            });
        }

« Options » contiennent le nombre de boutons pour créer, tempToMaintain est une variable qui est référencé à partir de Firebase. Je suis en train d'obtenir la valeur de la liste et le mettre à jour Firebase. Comment puis-je parvenir, toute aide est grandement appréciée.

alainlompo:

en Java vous ne pouvez pas utiliser non-finale (et non efficace-finale des variables) dans lambda, ainsi que dans les classes internes anonymes.

Vous pouvez vous débarrasser de l'expression lambda en créant une classe qui implémente l' View.OnClickListenerinterface et lui donnent la variable i en tant que paramètre constructeur.

par exemple:

class MyButtonClickListener implements View.OnClickListener {
   private int parameterIndex;

   public MyButtonClickListener(int parameterIndex) {
      this.parameterIndex = parameterIndex;
   }

   public void onClick(View v) {
      tempToMaintain.setValue(listParameters.get(parameterIndex));
   }
}

Et cela devrait l' être. Passe tempToMaintain et listParameters en tant que paramètres du constructeur (comme nous l' avons fait avec parameterIndex ) si vos nouvelles instances de classe ne peuvent pas y accéder contextuellement.

Maintenant, vous pouvez changer la liaison au gestionnaire d'événements clickListener pour ressembler à:

for (int i = 0; i < options; i++) {
   Button button = new Button(this);
   button.setId(position);
   buttons[i] = button;
   buttons[i].setOnClickListener(new MyButtonClickListener(i));
}

J'espère que cela t'aides.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=292651&siteId=1
conseillé
Classement