我正在尝试从数据库生成一组带有数据的按钮。但点击我面对以下的恐怖
从内部类中访问变量'i',需要声明为final,
由于i的值随循环的变化而变化,因此我无法将其设置为最终值,
footnoteBtns[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
footnote = myDbHelper.getFootnote(chapterNumber, translationList.get(i).get("transNo"));
Popup();
}
});
答案 0 :(得分:1)
您可以添加一个最终的附加变量并设置为i:
final int j = i;
然后在重写的onClick方法中使用那个。
你必须这样做的原因是onClick是在另一个时间点调用的,而不是直接在for循环中调用 - >异步。因此,您需要确保在后面的调用方法中应该使用哪个值。这就是变量需要最终的原因。
答案 1 :(得分:0)
一般来说,将setOnClickListener放在循环中是非常奇怪的方法,但在您的情况下,您可以使用以下代码解决它:
for( int i = 0; i < N; i++) {
final int p = i;
footnoteBtns[p].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
footnote = myDbHelper.getFootnote(chapterNumber, translationList.get(p).get("transNo"));
popup();
}
});
}
答案 2 :(得分:0)
尝试使用此代替当前代码:
class MyOnClickListener extends View.OnClickListener {
private int myi;
public MyOnClickListener(int i) {
myi = i;
}
@Override
public void onClick(View v) {
footnote = myDbHelper.getFootnote(chapterNumber, translationList.get(myi).get("transNo"));
Popup();
}
};
footnoteBtns[i].setOnClickListener(new MyOnClickListener(i));