我是java和android的初学者。在我试图制作的应用程序中,我使用以下for循环:
for(int current = 0; current < cityDetailsArray.size(); current++) {
row = new TableRow(this);
OnClickListener rowClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDetailsView(cityDetailsArray.get(current)); //error - Cannot refer to a non-final variable current inside an inner class defined in a different method
}
};
row.setOnClickListener(rowClickListener);
//rest of the loop
}
正如评论中显示的那样,弹出错误,修复方法是将final
添加到int current
。我做了那个,然后在final int current
行中弹出了这个错误:
The final local variable current cannot be assigned. It must be blank and not using a compound assignment
没有显示修复,但显然是删除final
。我该怎么做才能解决这个问题?
答案 0 :(得分:4)
唯一的选择是在for
循环中声明另一个变量:
for(int current = 0; current < cityDetailsArray.size(); current++) {
row = new TableRow(this);
final int currentCopy = current;
OnClickListener rowClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
showDetailsView(cityDetailsArray.get(currentCopy));
}
};
row.setOnClickListener(rowClickListener);
//rest of the loop
}
你当然不能使循环变量current
final
,因为你在循环本身的递增/递减部分递增它。另外,you can't use a non-final
local variable inside an anonymous inner class。你可以让current
成为一个实例变量,但这几乎是不可接受的。
因此,要在匿名类中使用current
,您可以创建该变量的副本,并生成currentCopy
final
。因此,对于循环的每次迭代,您将创建一个与current
具有相同值的新变量,这将满足您的目的。
答案 1 :(得分:4)
更好的选择是使用enhanced for
loop,因此您不需要final int
变量或int
变量:
for (final CityDetail cityDetail : cityDetailsArray) {
OnClickListener rowClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
showDetailsView(cityDetail);
}
};
row.setOnClickListener(rowClickListener);
//rest of the loop
}
请注意,当将数据从当前方法传递到anonymous class时,您需要使用final
变量,因为匿名内部类不应该能够修改引用(如果是基元,则为on) ,它的价值)。
答案 2 :(得分:0)
试试这个..
for(int current = 0; current < 50; current++) {
final int value = current;
row = new TableRow(this);
OnClickListener rowClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDetailsView(cityDetailsArray.get(value)); //error - Cannot refer to a non-final variable current inside an inner class defined in a different method
}
};
row.setOnClickListener(rowClickListener);
}
修改强>
你不能将自动增量设为最终,因此将其分配给另一个值然后你可以使用它
final
仅涉及引用本身,而不是引用对象的内容
答案 3 :(得分:0)
您可以在侦听器中创建最终字段,并为其指定值current
。
答案 4 :(得分:-1)
将当前变量声明为全局..
int current = 0; //声明全局..
并且喜欢这样..
for(; current&lt; cityDetailsArray.size(); current ++){ row = new TableRow(this);
OnClickListener rowClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDetailsView(cityDetailsArray.get(current)); //error - Cannot refer to a non-final variable current inside an inner class defined in a different method
}
};
row.setOnClickListener(rowClickListener);
//rest of the loop
}