0

Androidフォンに保存されている.txtファイルから特定の行を削除しようとしています。これは私がそれをやろうとしている方法です:

public void removeLineFrom (String filePath, String lineToRemove){
    try {
          File oldFile = new File(filePath);
          File tempFile = new File(externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/temp file.txt");

          BufferedReader br = new BufferedReader(new FileReader(filePath));
          PrintWriter pw = new PrintWriter(new FileWriter(tempFile));

          String line = null;

          //Read from the original file and write to the new
          //unless content matches data to be removed.
          while ((line = br.readLine()) != null) {

            if (!line.equals(lineToRemove)) {

              pw.write(line);
              pw.flush();
            }
          }
          pw.close();
          br.close();

          //Delete the original file
          oldFile.delete();

          //Rename the new file to the filename the original file had.
          tempFile.renameTo(recordedFiles);

        }
        catch (FileNotFoundException ex) {
          ex.printStackTrace();
        }
        catch (IOException ex) {
          ex.printStackTrace();
        }
}

このメソッドを次のように呼び出すたびに:

removeLineFrom(externalStoragePath + File.separator + 
    "/Android/data/com.whizzappseasyvoicenotepad/recorded files.txt", 
    recordedFilesArray.get(toDelete));

アプリがクラッシュします。これはlogcatエラーです:

08-08 15:24:22.225: E/AndroidRuntime(6146): java.lang.IndexOutOfBoundsException: 
    Invalid index 1, size is 1

問題は上記の行(メソッドの呼び出し)にあると言われています。インデックスが無効になる理由がわかりません。これは toDelete 変数です:

toDelete = arg2;

誰かが必要な場合は onItemLongClick 全体:

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, recordedFilesArray.get(toDelete) + ".mp3");
                    deleteFile.delete();
                    Log.i("TAG", "Deleting file: " + directory + recordedFilesArray.get(toDelete) + ".mp3");

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

                    removeLineFrom(externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/recorded files.txt", recordedFilesArray.get(toDelete));

                    Toast toast = Toast.makeText(getApplicationContext(), "Deleted", Toast.LENGTH_SHORT);
                    toast.show();

                    dialog.dismiss();
                }
            });

            deleteAlert.setNegativeButton("No", null);
            deleteAlert.show();
            return false;
        }

    });
4

3 に答える 3

2

問題はここにあります:

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

removeLineFrom(externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/recorded files.txt", recordedFilesArray.get(toDelete));

メソッドを呼び出す前に配列から arg2 を削除しているため、メソッドを呼び出すと、arg2 (toDelete) はもう存在しません。これを機能させるには、listAdapter から項目を削除する前にメソッド (removeLineFrom) を呼び出すだけです。

于 2013-08-08T13:43:51.793 に答える
0

配列のサイズが 1 で、インデックスが 1 の場合、それは範囲外です。配列はインデックス 0 から始まります。

于 2013-08-08T13:31:57.577 に答える
0

recordedFilesArray要素は 1 つしかありませんが、2 つ目の要素を取得しようとすると、配列インデックスは 0 から始まります。

于 2013-08-08T13:32:55.020 に答える