2014-10-09 54 views
-1

我寫了下一個android代碼。變量的位置必須聲明爲final。我不明白爲什麼......當我使用Eclipse調試器時,它確實可以識別行中的位置值:myMovieList.remove(position); ?當我必須使用最後的聲明

我會感謝您對此問題的幫助。 泰迪

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


     myListView = (ListView) findViewById(R.id.mylistView); 
     myListView.setOnItemClickListener(MainActivity.this); 

    ....... 
    ....... 
    ....... 
} 



@Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     showDeleteDialog(position); 
    } 

    private void showDeleteDialog(final int position) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
     builder.setTitle("Delete ??"); 
     builder.setMessage("Are you shure...."); 
     builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
      } 
     }); 
     builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 


       myMovieList.remove(position); 
       objAdapter.notifyDataSetChanged(); 

      } 
     }); 
     builder.show(); 

    } 
+0

'position'必須是'final',因爲你是從一個匿名內部類(你用於正面按鈕的那個)引用它的。 – CommonsWare 2014-10-09 12:02:17

回答

2

當你寫類似:

builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      myMovieList.remove(position); 
      objAdapter.notifyDataSetChanged(); 
     } 
    }); 

這就是所謂的匿名內部類(在new DialogInterface.OnClickListener() { ... }部分),因爲你隱式地創建一個類擴展DialogInterface.OnClickListener(和壓倒一切的方法)沒有名字。

這個匿名內部類使用position,它超出了它的範圍,所以它需要以某種方式存儲它。這就是爲什麼它需要知道position在聲明這個匿名類的那一刻和代碼確實被執行的那一刻之間不會改變。

使用final關鍵字,您可以證明此變量不會更改,因此您允許匿名內部類在內部存儲position的當前值,而不會稍後失去同步風險。

+0

謝謝!我已改變的代碼,所以我可以使用調試器看到經由可變myPosition可變位置的值:{ \t \t \t \t \t \t \t \t INT myPosition; \t \t \t \t myPosition = position; \t \t \t \t myMovieList.remove(myPosition); – 2014-10-09 12:47:48