Reputation: 95
I'm trying to remove a specific line from .txt file, that is stored on my android phone. This is how I'm trying to do it:
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();
}
}
Everytime I call this method like this:
removeLineFrom(externalStoragePath + File.separator +
"/Android/data/com.whizzappseasyvoicenotepad/recorded files.txt",
recordedFilesArray.get(toDelete));
The app crashes. This is the logcat error:
08-08 15:24:22.225: E/AndroidRuntime(6146): java.lang.IndexOutOfBoundsException:
Invalid index 1, size is 1
It says the problem is in the line posted above (calling the method). I don't know why the index would be invalid. This is toDelete variable:
toDelete = arg2;
Whole onItemLongClick if anyone needs:
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;
}
});
Upvotes: 0
Views: 1955
Reputation: 6522
The problem is here:
listAdapter.remove(listAdapter.getItem(toDelete));
listAdapter.notifyDataSetChanged();
removeLineFrom(externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/recorded files.txt", recordedFilesArray.get(toDelete));
You are removing arg2 from the array, before you call your method, that's why when you call your method, the arg2 (toDelete) doesn't exist anymore. To make it work, simply call your method (removeLineFrom) before removing item from listAdapter.
Upvotes: 2
Reputation: 3760
Your recordedFilesArray
has only one element but You trying to get a 2nd one, array indexes start at 0.
Upvotes: 0
Reputation: 3452
If size of the array is 1 and your index is 1 it is out of bounds just like it says. Arrays start at index 0.
Upvotes: 0