2013-08-06 51 views
0

我試圖從列表視圖中刪除特定的行,但我的應用程序不斷崩潰。從列表視圖中刪除特定的行?

首先,我試圖只除去項形式listAdapter,但它崩潰:

listAdapter.remove(listAdapter.getItem(toDelete)); 
listAdapter.notifyDataSetChanged(); 

然後我還試圖從ListView中直接除去它,但它也崩潰:

listView.removeViewAt(toDelete); 
listAdapter.notifyDataSetChanged(); 

toDelete是整數具有我點擊的行的數字ID的變量。

那麼我怎樣才能從列表視圖中刪除特定的行?

這是完整的代碼,如果有人想它:

listView.setOnItemLongClickListener(new OnItemLongClickListener(){ 

     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
       int arg2, long arg3) { 
      deleteAlert.setTitle("Warning"); 
      deleteAlert.setMessage("Are you sure you want to delete this?"); 
      toDelete = arg2; 
      deleteAlert.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        File directory = new File (externalStoragePath + File.separator + "Android/data/com.whizzappseasyvoicenotepad/"); 
        File deleteFile = new File (directory, fileNames.get(toDelete) + ".mp3"); 
        deleteFile.delete(); 
        dialog.dismiss(); 

        listView.removeViewAt(toDelete); 
        listAdapter.notifyDataSetChanged(); 
        Log.i("TAG", "Deleting file: " + directory + fileNames.get(toDelete) + ".mp3"); 
       } 
      }); 

這真的很難擴大「崩潰」的一部分。這很簡單:只要我點擊「是」按鈕,應用程序崩潰。這裏的logcat文件,如果有幫助:

08-06 19:05:07.437: E/AndroidRuntime(16257): FATAL EXCEPTION: main 
08-06 19:05:07.437: E/AndroidRuntime(16257): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
08-06 19:05:07.437: E/AndroidRuntime(16257): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at java.util.ArrayList.get(ArrayList.java:308) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at com.whizzappseasyvoicenotepad.RecordedLibrary$2$1.onClick(RecordedLibrary.java:113) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at android.os.Looper.loop(Looper.java:137) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at android.app.ActivityThread.main(ActivityThread.java:5103) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at java.lang.reflect.Method.invokeNative(Native Method) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at java.lang.reflect.Method.invoke(Method.java:525) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-06 19:05:07.437: E/AndroidRuntime(16257): at dalvik.system.NativeStart.main(Native Method) 
+0

@Keyser檢查我的編輯後,請 – Guy

+0

嘛錯誤是不言自明的。你的數組列表的大小爲0.你有沒有嘗試過任何的建議[在這裏](http://stackoverflow.com/a/5344958/645270)? – keyser

+0

'listAdapter.remove(listAdapter.getItem(toDelete));'是正確的方法。你可以發佈你的適配器代碼嗎? –

回答

0

我發現了這個問題!這完全是我的錯,我是一個淺薄的人。

問題是我在刪除行之前調用了dialog.dismiss()。我只是在的onclick結束移動dialog.dismiss()和現在的作品,因爲它應該:)

這是現在的代碼:

deleteAlert.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        File directory = new File (externalStoragePath + File.separator + "Android/data/com.whizzappseasyvoicenotepad/"); 
        File deleteFile = new File (directory, fileNames.get(toDelete) + ".mp3"); 
        deleteFile.delete(); 
        Log.i("TAG", "Deleting file: " + directory + fileNames.get(toDelete) + ".mp3"); 

        listAdapter.remove(listAdapter.getItem(toDelete)); 
        listAdapter.notifyDataSetChanged(); 

        dialog.dismiss(); 
       } 
      }); 
0

我認爲崩潰並不是因爲刪除,而是關於更新。

的關鍵是

listAdapter.notifyDataSetChanged(); 

你不能做到這裏面

public void onClick(DialogInterface dialog, int which) 
{ 
} 

因爲它是UIThread外(也有人叫它主線程),你只能修改裏面的UI UI線程。 notifyDataSetChanged()是要修改UI。

爲了解決這個問題,你可以使用Handler代替。 是這樣的:

**Handler myHandler = new Handler() 
{ 
    public void handleMessage(android.os.Message msg) 
    { 
     listAdapter.notifyDataSetChanged(); 
    } 
};** 
listView.setOnItemLongClickListener(new OnItemLongClickListener(){ 

     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
       int arg2, long arg3) { 
      deleteAlert.setTitle("Warning"); 
      deleteAlert.setMessage("Are you sure you want to delete this?"); 
      toDelete = arg2; 
      deleteAlert.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        File directory = new File (externalStoragePath + File.separator + "Android/data/com.whizzappseasyvoicenotepad/"); 
        File deleteFile = new File (directory, fileNames.get(toDelete) + ".mp3"); 
        deleteFile.delete(); 
        dialog.dismiss(); 

        listView.removeViewAt(toDelete); 
        **myHandler.sendMessage();** 
        Log.i("TAG", "Deleting file: " + directory + fileNames.get(toDelete) + ".mp3"); 
       } 
      }); 
+0

非常感謝您花時間和回覆,但我找到了一個更簡單的解決方案(查看我的回答):) – Guy