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)
4

2 に答える 2

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();
                }
            });
于 2013-08-06T21:20:18.343 に答える