Ошибка с удалением на Java Arraylist Android - PullRequest
0 голосов
/ 06 ноября 2019

Я получил сообщение об ошибке из консоли Google Play:

FATAL EXCEPTION: ControllerMessenger
Process: my_package, PID: 19868
java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
    at java.util.ArrayList.remove(ArrayList.java:405)
    at my_package.notepad.utils_adapters.NotesAdapter.removeItem(NotesAdapter.kt:251)
    at my_package.notepad.utils_adapters.NotesAdapter.access$removeItem(NotesAdapter.kt:25)
    at my_package.notepad.utils_adapters.NotesAdapter$deleteNote$1.onResponse(NotesAdapter.kt:231)

Я понимаю, что приложение пытается работать с неверным индексом и в результате оно получает сбой. Проблема заключается в этом методе:

private fun removeItem(position: Int) {
        records.removeAt(position)
        notifyItemRemoved(position)
        notifyItemRangeChanged(position, records.size)
    }

этот метод может быть вызван, когда используемый пытается удалить элемент из определенного списка. Я попытался заменить removeAt на remove, но получил строгое предложение использовать removeAt. Может быть, я могу проверить, когда позиция не равна -1, или это плохая идея?

UPDATE

удалить вызов метода item:

private fun deleteNote(id: Int?, context: Context, position: Int) {
        Singleton.apiService().deleteNote("Bearer " + context.getSharedPreferences("app_data", 0).getString("access_token", ""), id).enqueue(object : Callback<NoteAction> {
            override fun onResponse(call: Call<NoteAction>, response: Response<NoteAction>) {
                if (response.isSuccessful) {
                    Toast.makeText(context, "Successfully deleted", Toast.LENGTH_SHORT).show()
                    removeItem(position)
                } else {
                    try {
                        val jObjError = JSONObject(Objects.requireNonNull<ResponseBody>(response.errorBody()).string())
                        Singleton.error["message"] = jObjError.getString("message")
                        Singleton.error["request_no"] = "19"
                        Singleton.workingWithErrors(Singleton.error, context)
                    } catch (e: Exception) {

                    }
                }
            }

            override fun onFailure(call: Call<NoteAction>, t: Throwable) {
            }

        })

1 Ответ

1 голос
/ 06 ноября 2019

Попробуйте проверить положение включительно с коллекциями перед выполнением операции удаления.

private fun removeItem(position: Int) {
    if(position < 0 || position >= records.size)
        return

    records.removeAt(position)
    notifyItemRemoved(position)
    notifyItemRangeChanged(position, records.size)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...