Как я могу управлять onClickListener динамически созданной кнопки? - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь создать кнопки 'n' на основе выбранной пользователем опции. Количество кнопок может варьироваться от 1 до 3. Однако у меня возникают трудности при попытке обновить переменную в зависимости от нажатой кнопки. Это дает ошибку «Переменная, используемая в лямбда-выражении, должна быть окончательной или эффективно конечной». Я понимаю ошибку, но не могу понять, как я могу решить эту проблему. Вот мой пример кода:

        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' содержит количество кнопок для создания, tempToMaintain - это переменная, на которую ссылается Firebase. Я пытаюсь получить значение из списка и обновить его на Firebase. Как мне этого добиться, любая помощь очень ценится.

1 Ответ

1 голос
/ 15 марта 2020

в Java вы не можете использовать не конечные (а также неэффективно-окончательные ) переменные в лямбда-выражениях, а также в анонимных внутренних классах.

Вы можете получить избавьтесь от лямбда-выражения, создав класс, реализующий интерфейс View.OnClickListener, и передайте ему переменную i в качестве параметра конструктора.

, например:

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));
   }
}

И это должно быть так. Передайте tempToMaintain и listParameters в качестве параметров конструктора (так же, как мы это сделали с parameterIndex ), если экземпляры вашего нового класса не могут контекстно получить к ним доступ.

Теперь Вы можете изменить привязку к обработчику событий clickListener, чтобы он выглядел следующим образом:

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

Надеюсь, это поможет.

...