我正在尝试创建一个onListItemClick,它将向用户显示一个包含两个选项的对话框。每个选项都应调用一个函数来执行某个操作。我得到的错误是:
不能引用在不同方法中定义的内部类中的非最终变量位置
protected void onListItemClick(ListView l, View v, int position, long id){
final CharSequence[] items = {"Delete", "Show"};
MyPOI mpoi= myAdapter.getItem(position);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick an option");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if(items[item].equals("Delete")){
dbc.deletePOI(position);
}
}
});
AlertDialog alert = builder.create();
alert.show();
super.onListItemClick(l, v, position, id);
}
答案 0 :(得分:2)
尝试制作position
final:
protected void onListItemClick(ListView l, View v, final int position, long id) {
,类似于编译器抱怨的任何其他变量。
答案 1 :(得分:1)
不能引用非最终变量 内部类中的位置已定义 用不同的方法
如果不是在方法中定义类,而是在父类级别定义它(声明它),那么你应该解决你的问题。 (提前免费提示)我通常更喜欢避免使用内部类,因为没有它们会产生更少的耦合代码,从而使代码重用更容易。
无论如何,回到你的问题,你应该有像
这样的东西public class A {
void method b(){
something.setOnClickListener( new OnClickListener() { ... } ); // this is the inner class
}
}
我建议您使用
class A {
void method b(){
something.setOnClickListener( new BetterInnerClass()); // this is the inner class
}
private class BetterInnerClass implements OnClickListener{
...
}
}
答案 2 :(得分:0)
我实际上自己设法修复它。这是我的解决方案,以防其他人遇到同样的问题:
MyPOI mpoi;
protected void onListItemClick(ListView l, View v, int position, long id){
final CharSequence[] items = {"Delete", "Show"};
mpoi= myAdapter.getItem(position);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select an option");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if(items[item].equals("Delete")){
executeDelete();
}
}
});
AlertDialog alert = builder.create();
alert.show();
super.onListItemClick(l, v, position, id);
}
public void executeDelete(){
try{
int i=dbc.deletePOI(mpoi.poiId);
if(i==-2){
Toast.makeText(this, "Error in operation. Please try again", Toast.LENGTH_SHORT).show();
}
else if(i==1){
Toast.makeText(this, "Record deleted succesfully.", Toast.LENGTH_LONG).show();
}
finish();
}catch(Exception ex){
ex.printStackTrace();
}
}