onListItemClick和clicklisteners的问题

时间:2011-03-01 22:16:40

标签: android

我正在尝试创建一个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);
 }

3 个答案:

答案 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();
     }

 }