开发者社区> 问答> 正文

如何管理动态创建的按钮的onClickListener?

我正在尝试根据用户选择的选项创建“ n”个按钮。这些按钮的范围可以从1到3。但是,当我尝试根据按下的按钮来更新变量时,我遇到了困难。它给出错误“ lambda表达式中使用的变量应该是最终的或实际上是最终的”。我了解错误,但无法弄清楚如何解决此问题。这是我的示例代码:

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

            });
        }

“选项”包含要创建的按钮数量,tempToMaintain是从Firebase引用的变量。我正在尝试从列表中获取值并在Firebase上对其进行更新。我如何实现这一目标,我们将不胜感激。

问题来源:Stack Overflow

展开
收起
montos 2020-03-23 21:26:15 352 0
1 条回答
写回答
取消 提交回答
  • 在Java中,您不能在lambda以及匿名内部类中使用非最终变量(以及非有效最终变量)。

    您可以通过创建实现该View.OnClickListener接口的类并将其变量i作为构造函数参数来摆脱lambda表达式。

    例如:

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

    回答来源:Stack Overflow

    2020-03-23 21:27:19
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载