Estoy intentando crear botones 'n' en base al usuario la opción que ha seleccionado. Los botones pueden variar de 1 a 3. Sin embargo estoy teniendo dificultades al intentar actualizar la variable dependiendo del botón pulsado. Se da la "variable utilizada en la expresión lambda debe ser final o efectivamente final" error. Yo entiendo el error, pero no puedo averiguar cómo puedo resolver este problema. Aquí está mi código de ejemplo:
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));
});
}
'Opciones' contienen el número de botones para crear, tempToMaintain es una variable que se hace referencia desde Firebase. Estoy tratando de obtener el valor de la lista y actualizarla en Firebase. ¿Cómo puedo lograr esto, cualquier ayuda es muy apreciada.
en Java no se puede utilizar no finales (y también no-finales efectivamente las variables) en lambda, así como en las clases internas anónimas.
Se podría deshacerse de la expresión lambda mediante la creación de una clase que implementa la View.OnClickListener
interfaz y le dan la variable i como un parámetro de constructor.
por ejemplo:
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));
}
}
Y que debe ser la misma. Pase tempToMaintain y listParameters como parámetros del constructor (tal como lo hicimos con índiceParámetros ) si sus nuevas instancias de la clase no pueden acceder a ellos contextualmente.
Ahora se puede cambiar el enlace al controlador de eventos clickListener para parecerse a:
for (int i = 0; i < options; i++) {
Button button = new Button(this);
button.setId(position);
buttons[i] = button;
buttons[i].setOnClickListener(new MyButtonClickListener(i));
}
Espero que esto ayude.